|
3 | 3 | import operator
|
4 | 4 | import pickle
|
5 | 5 | import doctest
|
| 6 | +import platform |
6 | 7 |
|
7 | 8 | from flint.utils.flint_exceptions import DomainError
|
8 | 9 |
|
|
11 | 12 | if sys.version_info[0] >= 3:
|
12 | 13 | long = int
|
13 | 14 |
|
| 15 | +PYPY = platform.python_implementation() == "PyPy" |
| 16 | + |
14 | 17 | ctx = flint.ctx
|
15 | 18 |
|
16 | 19 | def raises(f, exception):
|
@@ -141,13 +144,17 @@ def test_fmpz():
|
141 | 144 | for a, b, c, ab_mod_c in pow_mod_examples:
|
142 | 145 | assert pow(a, b, c) == ab_mod_c
|
143 | 146 | assert pow(flint.fmpz(a), b, c) == ab_mod_c
|
144 |
| - assert pow(a, flint.fmpz(b), c) == ab_mod_c |
145 |
| - assert pow(a, b, flint.fmpz(c)) == ab_mod_c |
146 | 147 | assert pow(flint.fmpz(a), flint.fmpz(b), c) == ab_mod_c
|
147 | 148 | assert pow(flint.fmpz(a), b, flint.fmpz(c)) == ab_mod_c
|
148 |
| - assert pow(a, flint.fmpz(b), flint.fmpz(c)) == ab_mod_c |
149 | 149 | assert pow(flint.fmpz(a), flint.fmpz(b), flint.fmpz(c)) == ab_mod_c
|
150 | 150 |
|
| 151 | + # 3-arg pow cannot be made to work with fmpz on PyPy |
| 152 | + # https://github.com/flintlib/python-flint/issues/74 |
| 153 | + if not PYPY: |
| 154 | + assert pow(a, flint.fmpz(b), c) == ab_mod_c |
| 155 | + assert pow(a, b, flint.fmpz(c)) == ab_mod_c |
| 156 | + assert pow(a, flint.fmpz(b), flint.fmpz(c)) == ab_mod_c |
| 157 | + |
151 | 158 | assert raises(lambda: pow(flint.fmpz(2), 2, 0), ValueError)
|
152 | 159 | # XXX: Handle negative modulus like int?
|
153 | 160 | assert raises(lambda: pow(flint.fmpz(2), 2, -1), ValueError)
|
|
0 commit comments