@@ -1422,7 +1422,15 @@ def test_nmod_poly():
14221422 assert raises (lambda : [] * s , TypeError )
14231423 assert raises (lambda : [] // s , TypeError )
14241424 assert raises (lambda : [] % s , TypeError )
1425- assert raises (lambda : pow (P ([1 ,2 ],3 ), 3 , 4 ), NotImplementedError )
1425+ assert raises (lambda : [] % s , TypeError )
1426+ assert raises (lambda : s .reverse (- 1 ), ValueError )
1427+ assert raises (lambda : s .compose ("A" ), TypeError )
1428+ assert raises (lambda : s .compose_mod (s , "A" ), TypeError )
1429+ assert raises (lambda : s .compose_mod ("A" , P ([3 ,6 ,9 ],17 )), TypeError )
1430+ assert raises (lambda : s .compose_mod (s , P ([0 ], 17 )), ZeroDivisionError )
1431+ assert raises (lambda : pow (s , - 1 , P ([3 ,6 ,9 ],17 )), ValueError )
1432+ assert raises (lambda : pow (s , 1 , "A" ), TypeError )
1433+ assert raises (lambda : pow (s , "A" , P ([3 ,6 ,9 ],17 )), TypeError )
14261434 assert str (P ([1 ,2 ,3 ],17 )) == "3*x^2 + 2*x + 1"
14271435 assert P ([1 ,2 ,3 ],17 ).repr () == "nmod_poly([1, 2, 3], 17)"
14281436 p = P ([3 ,4 ,5 ],17 )
@@ -2087,6 +2095,18 @@ def test_fmpz_mod_poly():
20872095 assert f * f == f ** 2
20882096 assert f * f == f ** fmpz (2 )
20892097
2098+ # pow_mod
2099+ # assert ui and fmpz exp agree for polynomials and generators
2100+ R_gen = R_test .gen ()
2101+ assert pow (f , 2 ** 60 , g ) == pow (pow (f , 2 ** 30 , g ), 2 ** 30 , g )
2102+ assert pow (R_gen , 2 ** 60 , g ) == pow (pow (R_gen , 2 ** 30 , g ), 2 ** 30 , g )
2103+
2104+ # Check other typechecks for pow_mod
2105+ assert raises (lambda : pow (f , - 2 , g ), ValueError )
2106+ assert raises (lambda : pow (f , 1 , "A" ), TypeError )
2107+ assert raises (lambda : pow (f , "A" , g ), TypeError )
2108+ assert raises (lambda : f .pow_mod (2 ** 32 , g , mod_rev_inv = "A" ), TypeError )
2109+
20902110 # Shifts
20912111 assert raises (lambda : R_test ([1 ,2 ,3 ]).left_shift (- 1 ), ValueError )
20922112 assert raises (lambda : R_test ([1 ,2 ,3 ]).right_shift (- 1 ), ValueError )
@@ -2118,6 +2138,13 @@ def test_fmpz_mod_poly():
21182138 # compose
21192139 assert raises (lambda : h .compose ("AAA" ), TypeError )
21202140
2141+ # compose mod
2142+ mod = R_test ([1 ,2 ,3 ,4 ])
2143+ assert f .compose (h ) % mod == f .compose_mod (h , mod )
2144+ assert raises (lambda : h .compose_mod ("AAA" , mod ), TypeError )
2145+ assert raises (lambda : h .compose_mod (f , "AAA" ), TypeError )
2146+ assert raises (lambda : h .compose_mod (f , R_test (0 )), ZeroDivisionError )
2147+
21212148 # Reverse
21222149 assert raises (lambda : h .reverse (degree = - 100 ), ValueError )
21232150 assert R_test ([- 1 ,- 2 ,- 3 ]).reverse () == R_test ([- 3 ,- 2 ,- 1 ])
@@ -2135,9 +2162,9 @@ def test_fmpz_mod_poly():
21352162 assert raises (lambda : f .mulmod (f , "AAA" ), TypeError )
21362163 assert raises (lambda : f .mulmod ("AAA" , g ), TypeError )
21372164
2138- # powmod
2139- assert f .powmod (2 , g ) == (f * f ) % g
2140- assert raises (lambda : f .powmod (2 , "AAA" ), TypeError )
2165+ # pow_mod
2166+ assert f .pow_mod (2 , g ) == (f * f ) % g
2167+ assert raises (lambda : f .pow_mod (2 , "AAA" ), TypeError )
21412168
21422169 # divmod
21432170 S , T = f .divmod (g )
@@ -2635,9 +2662,14 @@ def setbad(obj, i, val):
26352662 assert P ([1 , 1 ]) ** 2 == P ([1 , 2 , 1 ])
26362663 assert raises (lambda : P ([1 , 1 ]) ** - 1 , ValueError )
26372664 assert raises (lambda : P ([1 , 1 ]) ** None , TypeError )
2638-
2639- # # XXX: Not sure what this should do in general:
2640- assert raises (lambda : pow (P ([1 , 1 ]), 2 , 3 ), NotImplementedError )
2665+
2666+ # XXX: Not sure what this should do in general:
2667+ p = P ([1 , 1 ])
2668+ mod = P ([1 , 1 ])
2669+ if type (p ) not in [flint .fmpz_mod_poly , flint .nmod_poly ]:
2670+ assert raises (lambda : pow (p , 2 , mod ), NotImplementedError )
2671+ else :
2672+ assert p * p % mod == pow (p , 2 , mod )
26412673
26422674 assert P ([1 , 2 , 1 ]).gcd (P ([1 , 1 ])) == P ([1 , 1 ])
26432675 assert raises (lambda : P ([1 , 2 , 1 ]).gcd (None ), TypeError )
@@ -2667,7 +2699,6 @@ def setbad(obj, i, val):
26672699 if is_field :
26682700 assert P ([1 , 2 , 1 ]).integral () == P ([0 , 1 , 1 , S (1 )/ 3 ])
26692701
2670-
26712702def _all_mpolys ():
26722703 return [
26732704 (flint .fmpz_mpoly , flint .fmpz_mpoly_ctx , flint .fmpz , False ),
0 commit comments