Skip to content

Commit e6becb9

Browse files
committed
add tests for fmpz
1 parent 63be308 commit e6becb9

5 files changed

Lines changed: 115 additions & 2 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
build/*
22
dist/*
33
src/flint/*.c
4+
src/flint/*.html
45
doc/build/*
56
fmake*
67
*.whl

bin/activate

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export C_INCLUDE_PATH=$(pwd)/.local/include
22
export LIBRARY_PATH=$(pwd)/.local/lib
33
export LD_LIBRARY_PATH=$(pwd)/.local/lib
44
export PYTHONPATH=$(pwd)/src
5+
source .local/venv/bin/activate

bin/coverage.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export PYTHON_FLINT_COVERAGE=true
3434
python setup.py build_ext --inplace
3535

3636
coverage run test/test.py
37-
coverage run --append test/dtest.py
37+
#coverage run --append test/dtest.py
3838

3939
coverage report -m
4040
coverage html

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
setup(
7171
name='python-flint',
7272
cmdclass={'build_ext': build_ext},
73-
ext_modules=cythonize(ext_modules, compiler_directives=compiler_directives),
73+
ext_modules=cythonize(ext_modules, compiler_directives=compiler_directives, annotate=True),
7474
packages=['flint'],
7575
package_dir={'': 'src'},
7676
description='Bindings for FLINT and Arb',

test/test.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ def test_fmpz():
1919
assert flint.fmpz() == flint.fmpz(0)
2020
L = [0, 1, 2, 3, 2**31-1, 2**31, 2**63-1, 2**63, 2**64-1, 2**64]
2121
L += [-x for x in L]
22+
for i in L:
23+
f = flint.fmpz(i)
24+
assert int(f) == i
25+
assert flint.fmpz(f) == f
26+
assert flint.fmpz(str(i)) == f
27+
raises(lambda: flint.fmpz("qwe"), ValueError)
28+
raises(lambda: flint.fmpz([]), TypeError)
2229
for s in L:
2330
for t in L:
2431
for ltype in (flint.fmpz, int, long):
@@ -42,6 +49,7 @@ def test_fmpz():
4249
assert (ltype(s) >= rtype(t)) == (s >= t)
4350
if 0 <= t < 10:
4451
assert (ltype(s) ** rtype(t)) == (s ** t)
52+
assert flint.fmpz(2) != []
4553
assert +flint.fmpz(0) == 0
4654
assert +flint.fmpz(1) == 1
4755
assert +flint.fmpz(-1) == -1
@@ -55,6 +63,18 @@ def test_fmpz():
5563
assert isinstance(int(flint.fmpz(2)), int)
5664
assert long(flint.fmpz(2)) == 2
5765
assert isinstance(long(flint.fmpz(2)), long)
66+
l = [1, 2, 3]
67+
l[flint.fmpz(1)] = -2
68+
assert l == [1, -2, 3]
69+
d = {flint.fmpz(2): 3}
70+
d[flint.fmpz(2)] = -1
71+
assert d == {flint.fmpz(2): -1}
72+
assert flint.fmpz(2).bit_length() == 2
73+
assert flint.fmpz(-2).bit_length() == 2
74+
assert flint.fmpz(2).height_bits() == 2
75+
assert flint.fmpz(-2).height_bits() == 2
76+
assert flint.fmpz(2).height_bits(signed=True) == 2
77+
assert flint.fmpz(-2).height_bits(signed=True) == -2
5878
ctx.pretty = False
5979
assert repr(flint.fmpz(0)) == "fmpz(0)"
6080
assert repr(flint.fmpz(-27)) == "fmpz(-27)"
@@ -63,6 +83,97 @@ def test_fmpz():
6383
assert repr(flint.fmpz(-27)) == "-27"
6484
assert bool(flint.fmpz(0)) == False
6585
assert bool(flint.fmpz(1)) == True
86+
bigstr = '1' * 100
87+
big = flint.fmpz(bigstr)
88+
assert big.str() == bigstr
89+
assert big.str(condense=10) == '1111111111{...80 digits...}1111111111'
90+
raises(lambda: pow(flint.fmpz(2), 2, 3), NotImplementedError)
91+
assert flint.fmpz(6).gcd(flint.fmpz(9)) == 3
92+
assert flint.fmpz(6).gcd(9) == 3
93+
raises(lambda: flint.fmpz(2).gcd('asd'), TypeError)
94+
assert flint.fmpz(6).lcm(flint.fmpz(9)) == 18
95+
assert flint.fmpz(6).lcm(9) == 18
96+
raises(lambda: flint.fmpz(2).lcm('asd'), TypeError)
97+
assert flint.fmpz(25).factor() == [(5, 2)]
98+
n = flint.fmpz(10**100 + 1)
99+
assert n.factor() == [
100+
(73, 1), (137, 1), (401, 1), (1201, 1), (1601, 1), (1676321, 1), (5964848081, 1),
101+
(129694419029057750551385771184564274499075700947656757821537291527196801, 1)]
102+
103+
assert n.factor(trial_limit=100) == [
104+
(73, 1), (137, 1), (401, 1),
105+
(2493516234411471571047384039650897753117456334167082044912715710972543643391271845384040149601, 1)]
106+
assert n.factor_smooth() == [
107+
(73, 1), (137, 1), (401, 1), (1201, 1), (1601, 1),
108+
(1296814508839693536173209832765271992846610925502473758289451540212712414540699659186801, 1)]
109+
T, F, VE, OE = True, False, ValueError, OverflowError
110+
cases = [
111+
# (f, [f(-1), f(0), f(1), f(2), ... f(10)]),
112+
(lambda n: flint.fmpz(n).is_prime(),
113+
[0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0]),
114+
(lambda n: flint.fmpz(n).is_probable_prime(),
115+
[0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0]),
116+
(lambda n: flint.fmpz(n).is_perfect_power(),
117+
[T, T, T, F, F, T, F, F, F, T, T, F]),
118+
(lambda n: flint.fmpz(n).partitions_p(),
119+
[0, 1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42]),
120+
(lambda n: flint.fmpz(n).moebius_mu(),
121+
[1, 0, 1, -1, -1, 0, -1, 1, -1, 0, 0, 1]),
122+
(lambda n: flint.fmpz.fac_ui(n),
123+
[OE, 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]),
124+
(lambda n: flint.fmpz.primorial_ui(n),
125+
[OE, 1, 1, 2, 6, 6, 30, 30, 210, 210, 210, 210, 2310, 2310]),
126+
(lambda n: flint.fmpz.fib_ui(n),
127+
[OE, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]),
128+
(lambda n: flint.fmpz(n).rising(0),
129+
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
130+
(lambda n: flint.fmpz(n).rising(1),
131+
[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
132+
(lambda n: flint.fmpz(n).rising(2),
133+
[0, 0, 2, 6, 12, 20, 30, 42, 56, 72, 90, 110]),
134+
(lambda n: flint.fmpz.bin_uiui(n, 0),
135+
[OE, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
136+
(lambda n: flint.fmpz.bin_uiui(n, 1),
137+
[OE, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
138+
(lambda n: flint.fmpz.bin_uiui(n, 2),
139+
[OE, 0, 0, 1, 3, 6, 10, 15, 21, 28, 36, 45]),
140+
(lambda n: flint.fmpz.bell_number(n),
141+
[OE, 1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975]),
142+
(lambda n: flint.fmpz.euler_number(n),
143+
[OE, 1, 0, -1, 0, 5, 0, -61, 0, 1385, 0, -50521]),
144+
(lambda n: flint.fmpz.stirling_s1(n, 1),
145+
[OE, 0, 1, -1, 2, -6, 24, -120, 720, -5040, 40320, -362880]),
146+
(lambda n: flint.fmpz.stirling_s2(n, 2),
147+
[OE, 0, 0, 1, 3, 7, 15, 31, 63, 127, 255, 511]),
148+
(lambda n: flint.fmpz(n).divisor_sigma(2),
149+
[1, 0, 1, 5, 10, 21, 26, 50, 50, 85, 91, 130]),
150+
(lambda n: flint.fmpz(n).euler_phi(),
151+
[0, 0, 1, 1, 2, 2, 4, 2, 6, 4, 6, 4]),
152+
(lambda n: flint.fmpz(n).isqrt(),
153+
[VE, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3]),
154+
(lambda n: flint.fmpz(n).sqrtrem(),
155+
[VE, (0, 0), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), (3, 1)]),
156+
(lambda n: flint.fmpz(n).sqrtmod(11),
157+
[VE, 0, 1, VE, 5, 2, 4, VE, VE, VE, 3, VE]),
158+
(lambda n: flint.fmpz(n).root(3),
159+
[VE, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2]),
160+
(lambda n: flint.fmpz(n).jacobi(3),
161+
[-1, 0, 1, -1, 0, 1, -1, 0, 1, -1, 0, 1]),
162+
(lambda n: flint.fmpz(2).jacobi(n),
163+
[1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1]),
164+
]
165+
is_exception = lambda v: isinstance(v, type) and issubclass(v, Exception)
166+
167+
for func, values in cases:
168+
for n, val in enumerate(values, -1):
169+
if is_exception(val):
170+
raises(lambda: func(n), val)
171+
else:
172+
assert func(n) == val
173+
174+
raises(lambda: flint.fmpz(1).root(-1), ValueError)
175+
raises(lambda: flint.fmpz(1).jacobi('bad'), TypeError)
176+
66177

67178
def test_fmpz_poly():
68179
Z = flint.fmpz_poly

0 commit comments

Comments
 (0)