@@ -742,9 +742,9 @@ def test_fmpq():
742
742
assert raises (lambda : Q ("1.0" ), ValueError )
743
743
assert raises (lambda : Q ("1.5" ), ValueError )
744
744
assert raises (lambda : Q ("1/2/3" ), ValueError )
745
- assert raises (lambda : Q ([]), ValueError )
746
- assert raises (lambda : Q (1 , []), ValueError )
747
- assert raises (lambda : Q ([], 1 ), ValueError )
745
+ assert raises (lambda : Q ([]), TypeError )
746
+ assert raises (lambda : Q (1 , []), TypeError )
747
+ assert raises (lambda : Q ([], 1 ), TypeError )
748
748
assert bool (Q (0 )) == False
749
749
assert bool (Q (1 )) == True
750
750
assert Q (1 ,3 ) + Q (2 ,3 ) == 1
@@ -1049,9 +1049,8 @@ def test_fmpq_mat():
1049
1049
assert raises (lambda : Q (None ), TypeError )
1050
1050
assert Q ([[1 ,2 ,3 ],[4 ,5 ,6 ]]) == Q (2 ,3 ,[1 ,2 ,3 ,4 ,5 ,6 ])
1051
1051
assert raises (lambda : Q (2 ,3 ,[1 ,2 ,3 ,4 ,5 ]), ValueError )
1052
- # XXX: Should be TypeError not ValueError:
1053
- assert raises (lambda : Q ([[1 ,2 ,3 ],[4 ,[],6 ]]), ValueError )
1054
- assert raises (lambda : Q (2 ,3 ,[1 ,2 ,3 ,4 ,[],6 ]), ValueError )
1052
+ assert raises (lambda : Q ([[1 ,2 ,3 ],[4 ,[],6 ]]), TypeError )
1053
+ assert raises (lambda : Q (2 ,3 ,[1 ,2 ,3 ,4 ,[],6 ]), TypeError )
1055
1054
assert raises (lambda : Q (2 ,3 ,[1 ,2 ],[3 ,4 ]), ValueError )
1056
1055
assert bool (Q ([[1 ]])) is True
1057
1056
assert bool (Q ([[0 ]])) is False
@@ -1815,6 +1814,204 @@ def test_fmpz_mod_dlog():
1815
1814
assert g ** x == a
1816
1815
1817
1816
1817
+ def _all_polys ():
1818
+ return [
1819
+ # (poly_type, scalar_type, is_field)
1820
+ (flint .fmpz_poly , flint .fmpz , False ),
1821
+ (flint .fmpq_poly , flint .fmpq , True ),
1822
+ (lambda * a : flint .nmod_poly (* a , 17 ), lambda x : flint .nmod (x , 17 ), True ),
1823
+ ]
1824
+
1825
+
1826
+ def test_polys ():
1827
+ for P , S , is_field in _all_polys ():
1828
+
1829
+ assert P ([S (1 )]) == P ([1 ]) == P (P ([1 ])) == P (1 )
1830
+
1831
+ assert raises (lambda : P ([None ]), TypeError )
1832
+ assert raises (lambda : P (object ()), TypeError )
1833
+ assert raises (lambda : P (None ), TypeError )
1834
+ assert raises (lambda : P (None , None ), TypeError )
1835
+ assert raises (lambda : P ([1 ,2 ], None ), TypeError )
1836
+ assert raises (lambda : P (1 , None ), TypeError )
1837
+
1838
+ assert len (P ([])) == P ([]).length () == 0
1839
+ assert len (P ([1 ])) == P ([1 ]).length () == 1
1840
+ assert len (P ([1 ,2 ])) == P ([1 ,2 ]).length () == 2
1841
+ assert len (P ([1 ,2 ,3 ])) == P ([1 ,2 ,3 ]).length () == 3
1842
+
1843
+ assert P ([]).degree () == - 1
1844
+ assert P ([1 ]).degree () == 0
1845
+ assert P ([1 ,2 ]).degree () == 1
1846
+ assert P ([1 ,2 ,3 ]).degree () == 2
1847
+
1848
+ assert (P ([1 ]) == P ([1 ])) is True
1849
+ assert (P ([1 ]) != P ([1 ])) is False
1850
+ assert (P ([1 ]) == P ([2 ])) is False
1851
+ assert (P ([1 ]) != P ([2 ])) is True
1852
+
1853
+ assert (P ([1 ]) == None ) is False
1854
+ assert (P ([1 ]) != None ) is True
1855
+ assert (None == P ([1 ])) is False
1856
+ assert (None != P ([1 ])) is True
1857
+
1858
+ assert raises (lambda : P ([1 ]) < P ([1 ]), TypeError )
1859
+ assert raises (lambda : P ([1 ]) <= P ([1 ]), TypeError )
1860
+ assert raises (lambda : P ([1 ]) > P ([1 ]), TypeError )
1861
+ assert raises (lambda : P ([1 ]) >= P ([1 ]), TypeError )
1862
+ assert raises (lambda : P ([1 ]) < None , TypeError )
1863
+ assert raises (lambda : P ([1 ]) <= None , TypeError )
1864
+ assert raises (lambda : P ([1 ]) > None , TypeError )
1865
+ assert raises (lambda : P ([1 ]) >= None , TypeError )
1866
+ assert raises (lambda : None < P ([1 ]), TypeError )
1867
+ assert raises (lambda : None <= P ([1 ]), TypeError )
1868
+ assert raises (lambda : None > P ([1 ]), TypeError )
1869
+ assert raises (lambda : None >= P ([1 ]), TypeError )
1870
+
1871
+ assert P ([1 , 2 , 3 ])[1 ] == S (2 )
1872
+ assert P ([1 , 2 , 3 ])[- 1 ] == S (0 )
1873
+ assert P ([1 , 2 , 3 ])[3 ] == S (0 )
1874
+
1875
+ p = P ([1 , 2 , 3 ])
1876
+ p [1 ] = S (4 )
1877
+ assert p == P ([1 , 4 , 3 ])
1878
+
1879
+ def setbad (obj , i , val ):
1880
+ obj [i ] = val
1881
+
1882
+ assert raises (lambda : setbad (p , 2 , None ), TypeError )
1883
+ assert raises (lambda : setbad (p , - 1 , 1 ), ValueError )
1884
+
1885
+ for v in [], [1 ], [1 , 2 ]:
1886
+ if P == flint .fmpz_poly :
1887
+ assert P (v ).repr () == f'fmpz_poly({ v !r} )'
1888
+ elif P == flint .fmpq_poly :
1889
+ assert P (v ).repr () == f'fmpq_poly({ v !r} )'
1890
+ else :
1891
+ assert P (v ).repr () == f'nmod_poly({ v !r} , 17)'
1892
+
1893
+ assert repr (P ([])) == '0'
1894
+ assert repr (P ([1 ])) == '1'
1895
+ assert repr (P ([1 , 2 ])) == '2*x + 1'
1896
+ assert repr (P ([1 , 2 , 3 ])) == '3*x^2 + 2*x + 1'
1897
+
1898
+ p = P ([1 , 2 , 3 ])
1899
+ assert p (0 ) == p (S (0 )) == S (1 ) == 1
1900
+ assert p (1 ) == p (S (1 )) == S (6 ) == 6
1901
+ assert p (p ) == P ([6 , 16 , 36 , 36 , 27 ])
1902
+ assert raises (lambda : p (None ), TypeError )
1903
+
1904
+ assert bool (P ([])) is False
1905
+ assert bool (P ([1 ])) is True
1906
+
1907
+ assert + P ([1 , 2 , 3 ]) == P ([1 , 2 , 3 ])
1908
+ assert - P ([1 , 2 , 3 ]) == P ([- 1 , - 2 , - 3 ])
1909
+
1910
+ assert P ([1 , 2 , 3 ]) + P ([4 , 5 , 6 ]) == P ([5 , 7 , 9 ])
1911
+
1912
+ for T in [int , S , flint .fmpz ]:
1913
+ assert P ([1 , 2 , 3 ]) + T (1 ) == P ([2 , 2 , 3 ])
1914
+ assert T (1 ) + P ([1 , 2 , 3 ]) == P ([2 , 2 , 3 ])
1915
+
1916
+ assert raises (lambda : P ([1 , 2 , 3 ]) + None , TypeError )
1917
+ assert raises (lambda : None + P ([1 , 2 , 3 ]), TypeError )
1918
+
1919
+ assert P ([1 , 2 , 3 ]) - P ([4 , 5 , 6 ]) == P ([- 3 , - 3 , - 3 ])
1920
+
1921
+ for T in [int , S , flint .fmpz ]:
1922
+ assert P ([1 , 2 , 3 ]) - T (1 ) == P ([0 , 2 , 3 ])
1923
+ assert T (1 ) - P ([1 , 2 , 3 ]) == P ([0 , - 2 , - 3 ])
1924
+
1925
+ assert raises (lambda : P ([1 , 2 , 3 ]) - None , TypeError )
1926
+ assert raises (lambda : None - P ([1 , 2 , 3 ]), TypeError )
1927
+
1928
+ assert P ([1 , 2 , 3 ]) * P ([4 , 5 , 6 ]) == P ([4 , 13 , 28 , 27 , 18 ])
1929
+
1930
+ for T in [int , S , flint .fmpz ]:
1931
+ assert P ([1 , 2 , 3 ]) * T (2 ) == P ([2 , 4 , 6 ])
1932
+ assert T (2 ) * P ([1 , 2 , 3 ]) == P ([2 , 4 , 6 ])
1933
+
1934
+ assert raises (lambda : P ([1 , 2 , 3 ]) * None , TypeError )
1935
+ assert raises (lambda : None * P ([1 , 2 , 3 ]), TypeError )
1936
+
1937
+ assert P ([1 , 2 , 1 ]) // P ([1 , 1 ]) == P ([1 , 1 ])
1938
+ assert P ([1 , 2 , 1 ]) % P ([1 , 1 ]) == P ([0 ])
1939
+ assert divmod (P ([1 , 2 , 1 ]), P ([1 , 1 ])) == (P ([1 , 1 ]), P ([0 ]))
1940
+
1941
+ if is_field :
1942
+ assert P ([1 , 1 ]) // 2 == P ([S (1 )/ 2 , S (1 )/ 2 ])
1943
+ assert P ([1 , 1 ]) % 2 == P ([0 ])
1944
+ else :
1945
+ assert P ([1 , 1 ]) // 2 == P ([0 , 0 ])
1946
+ assert P ([1 , 1 ]) % 2 == P ([1 , 1 ])
1947
+
1948
+ assert 1 // P ([1 , 1 ]) == P ([0 ])
1949
+ assert 1 % P ([1 , 1 ]) == P ([1 ])
1950
+ assert divmod (1 , P ([1 , 1 ])) == (P ([0 ]), P ([1 ]))
1951
+
1952
+ assert raises (lambda : P ([1 , 2 , 1 ]) // None , TypeError )
1953
+ assert raises (lambda : P ([1 , 2 , 1 ]) % None , TypeError )
1954
+ assert raises (lambda : divmod (P ([1 , 2 , 1 ]), None ), TypeError )
1955
+
1956
+ assert raises (lambda : None // P ([1 , 1 ]), TypeError )
1957
+ assert raises (lambda : None % P ([1 , 1 ]), TypeError )
1958
+ assert raises (lambda : divmod (None , P ([1 , 1 ])), TypeError )
1959
+
1960
+ assert raises (lambda : P ([1 , 2 , 1 ]) // 0 , ZeroDivisionError )
1961
+ assert raises (lambda : P ([1 , 2 , 1 ]) % 0 , ZeroDivisionError )
1962
+ assert raises (lambda : divmod (P ([1 , 2 , 1 ]), 0 ), ZeroDivisionError )
1963
+
1964
+ assert raises (lambda : P ([1 , 2 , 1 ]) // P ([0 ]), ZeroDivisionError )
1965
+ assert raises (lambda : P ([1 , 2 , 1 ]) % P ([0 ]), ZeroDivisionError )
1966
+ assert raises (lambda : divmod (P ([1 , 2 , 1 ]), P ([0 ])), ZeroDivisionError )
1967
+
1968
+ if is_field :
1969
+ assert P ([2 , 2 ]) / 2 == P ([1 , 1 ])
1970
+ assert P ([1 , 2 ]) / 2 == P ([S (1 )/ 2 , 1 ])
1971
+ assert raises (lambda : P ([1 , 2 ]) / 0 , ZeroDivisionError )
1972
+ else :
1973
+ assert raises (lambda : P ([2 , 2 ]) / 2 , TypeError )
1974
+
1975
+ assert raises (lambda : 1 / P ([1 , 1 ]), TypeError )
1976
+ assert raises (lambda : P ([1 , 2 , 1 ]) / P ([1 , 1 ]), TypeError )
1977
+ assert raises (lambda : P ([1 , 2 , 1 ]) / P ([1 , 2 ]), TypeError )
1978
+
1979
+ assert P ([1 , 1 ]) ** 0 == P ([1 ])
1980
+ assert P ([1 , 1 ]) ** 1 == P ([1 , 1 ])
1981
+ assert P ([1 , 1 ]) ** 2 == P ([1 , 2 , 1 ])
1982
+ assert raises (lambda : P ([1 , 1 ]) ** - 1 , ValueError )
1983
+ assert raises (lambda : P ([1 , 1 ]) ** None , TypeError )
1984
+ # XXX: Not sure what this should do in general:
1985
+ assert raises (lambda : pow (P ([1 , 1 ]), 2 , 3 ), NotImplementedError )
1986
+
1987
+ assert P ([1 , 2 , 1 ]).gcd (P ([1 , 1 ])) == P ([1 , 1 ])
1988
+ assert raises (lambda : P ([1 , 2 , 1 ]).gcd (None ), TypeError )
1989
+
1990
+ if is_field :
1991
+ p1 = P ([1 , 0 , 1 ])
1992
+ p2 = P ([2 , 1 ])
1993
+ g , s , t = P ([1 ]), P ([1 ])/ 5 , P ([2 , - 1 ])/ 5
1994
+ assert p1 .xgcd (p2 ) == (g , s , t )
1995
+ assert raises (lambda : p1 .xgcd (None ), TypeError )
1996
+
1997
+ assert P ([1 , 2 , 1 ]).factor () == (S (1 ), [(P ([1 , 1 ]), 2 )])
1998
+
1999
+ assert P ([1 , 2 , 1 ]).sqrt () == P ([1 , 1 ])
2000
+ assert P ([1 , 2 , 2 ]).sqrt () is None
2001
+ if P == flint .fmpq_poly :
2002
+ assert P ([1 , 2 , 1 ], 3 ).sqrt () is None
2003
+ assert P ([1 , 2 , 1 ], 4 ).sqrt () == P ([1 , 1 ], 2 )
2004
+
2005
+ assert P ([]).deflation () == (P ([]), 1 )
2006
+ assert P ([1 , 2 ]).deflation () == (P ([1 , 2 ]), 1 )
2007
+ assert P ([1 , 0 , 2 ]).deflation () == (P ([1 , 2 ]), 2 )
2008
+
2009
+ assert P ([1 , 2 , 1 ]).derivative () == P ([2 , 2 ])
2010
+
2011
+ if is_field :
2012
+ assert P ([1 , 2 , 1 ]).integral () == P ([0 , 1 , 1 , S (1 )/ 3 ])
2013
+
2014
+
1818
2015
1819
2016
all_tests = [
1820
2017
test_pyflint ,
@@ -1835,5 +2032,6 @@ def test_fmpz_mod_dlog():
1835
2032
test_nmod_mat ,
1836
2033
test_arb ,
1837
2034
test_fmpz_mod ,
1838
- test_fmpz_mod_dlog
2035
+ test_fmpz_mod_dlog ,
2036
+ test_polys ,
1839
2037
]
0 commit comments