@@ -742,9 +742,9 @@ def test_fmpq():
742742 assert raises (lambda : Q ("1.0" ), ValueError )
743743 assert raises (lambda : Q ("1.5" ), ValueError )
744744 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 )
748748 assert bool (Q (0 )) == False
749749 assert bool (Q (1 )) == True
750750 assert Q (1 ,3 ) + Q (2 ,3 ) == 1
@@ -1049,9 +1049,8 @@ def test_fmpq_mat():
10491049 assert raises (lambda : Q (None ), TypeError )
10501050 assert Q ([[1 ,2 ,3 ],[4 ,5 ,6 ]]) == Q (2 ,3 ,[1 ,2 ,3 ,4 ,5 ,6 ])
10511051 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 )
10551054 assert raises (lambda : Q (2 ,3 ,[1 ,2 ],[3 ,4 ]), ValueError )
10561055 assert bool (Q ([[1 ]])) is True
10571056 assert bool (Q ([[0 ]])) is False
@@ -1815,6 +1814,204 @@ def test_fmpz_mod_dlog():
18151814 assert g ** x == a
18161815
18171816
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+
18182015
18192016all_tests = [
18202017 test_pyflint ,
@@ -1835,5 +2032,6 @@ def test_fmpz_mod_dlog():
18352032 test_nmod_mat ,
18362033 test_arb ,
18372034 test_fmpz_mod ,
1838- test_fmpz_mod_dlog
2035+ test_fmpz_mod_dlog ,
2036+ test_polys ,
18392037]
0 commit comments