Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/wapython
Path: blob/main/python/bench/src/cython/numbers.pyx
1068 views
1
from bench import register, all
2
3
from nt import xgcd, pi
4
from nt cimport gcd, xgcd_c, inverse_mod
5
6
def test_pi(n=100000):
7
assert pi(n) == 9592
8
9
10
register("pi(10**5)", pi)
11
12
cdef class A:
13
cdef int i
14
def __init__(self, int i):
15
self.i = i
16
17
def value(self):
18
return self.i
19
20
def __add__(self, right):
21
return A((<A>self).i + (<A>right).i)
22
23
def operator_add(int n=100000):
24
25
a = A(2)
26
b = A(3)
27
cdef int i
28
for i in range(n):
29
c = a + b
30
assert c.value() == 5
31
32
33
register("operator_add", operator_add)
34
35
36
def bench_gcd(int n=10**5):
37
cdef int s = 0
38
cdef int i
39
for i in range(n):
40
s += gcd(92250, 922350 + i)
41
assert s == 2414484
42
return s
43
44
45
register("gcd", bench_gcd)
46
47
48
def bench_xgcd_py(n=10**5):
49
s = 0
50
for i in range(n):
51
s += xgcd(92250, 922350 + i)[0]
52
assert s == 2414484
53
return s
54
55
# 10x slower, of course
56
# register("xgcd_py", bench_xgcd_py)
57
58
59
def bench_xgcd(int n=10**5):
60
cdef int s = 0, cx, cy, i
61
for i in range(n):
62
s += xgcd_c(92250, 922350 + i, &cx, &cy)
63
assert s == 2414484
64
return s
65
66
67
register("xgcd", bench_xgcd)
68
69
70
def bench_inverse_mod(long long n=10**5):
71
cdef long long i, s = 0
72
for i in range(1, n):
73
s += inverse_mod(i, 1073741827) # nextprime(2^30)
74
assert s == 53532319533988
75
76
77
register("bench_inverse_mod", bench_inverse_mod)
78
79
80
def sum_loop(int n=1000000):
81
cdef int s = 0, i
82
for i in range(0, n, 3):
83
s += 1
84
assert s == 333334
85
return s
86
87
88
register("sum_loop", sum_loop)
89
90
91
def sum_range(long long n=1000000):
92
n = sum(range(0, n, 3))
93
assert n == 166666833333
94
95
96
register("sum_range", sum_range)
97
98
99
def sum_reversed(long long n=1000000):
100
n = sum(reversed(list(range(0, n, 3))))
101
assert n == 166666833333
102
103
104
register("sum_reversed", sum_reversed)
105
106
if __name__ == '__main__':
107
all('numbers')
108
109