@@ -88,6 +88,8 @@ def test_fmpz():
8888 assert big .str () == bigstr
8989 assert big .str (condense = 10 ) == '1111111111{...80 digits...}1111111111'
9090 raises (lambda : pow (flint .fmpz (2 ), 2 , 3 ), NotImplementedError )
91+
92+ def test_fmpz_factor ():
9193 assert flint .fmpz (6 ).gcd (flint .fmpz (9 )) == 3
9294 assert flint .fmpz (6 ).gcd (9 ) == 3
9395 raises (lambda : flint .fmpz (2 ).gcd ('asd' ), TypeError )
@@ -99,13 +101,14 @@ def test_fmpz():
99101 assert n .factor () == [
100102 (73 , 1 ), (137 , 1 ), (401 , 1 ), (1201 , 1 ), (1601 , 1 ), (1676321 , 1 ), (5964848081 , 1 ),
101103 (129694419029057750551385771184564274499075700947656757821537291527196801 , 1 )]
102-
103104 assert n .factor (trial_limit = 100 ) == [
104105 (73 , 1 ), (137 , 1 ), (401 , 1 ),
105106 (2493516234411471571047384039650897753117456334167082044912715710972543643391271845384040149601 , 1 )]
106107 assert n .factor_smooth () == [
107108 (73 , 1 ), (137 , 1 ), (401 , 1 ), (1201 , 1 ), (1601 , 1 ),
108109 (1296814508839693536173209832765271992846610925502473758289451540212712414540699659186801 , 1 )]
110+
111+ def test_fmpz_functions ():
109112 T , F , VE , OE = True , False , ValueError , OverflowError
110113 cases = [
111114 # (f, [f(-1), f(0), f(1), f(2), ... f(10)]),
@@ -174,7 +177,6 @@ def test_fmpz():
174177 raises (lambda : flint .fmpz (1 ).root (- 1 ), ValueError )
175178 raises (lambda : flint .fmpz (1 ).jacobi ('bad' ), TypeError )
176179
177-
178180def test_fmpz_poly ():
179181 Z = flint .fmpz_poly
180182 assert Z () == Z ([])
@@ -304,6 +306,14 @@ def test_fmpq():
304306 assert Q (1 ,2 ) != 1
305307 assert Q (2 ,3 ) == Q (flint .fmpz (2 ),long (3 ))
306308 assert Q (- 2 ,- 4 ) == Q (1 ,2 )
309+ assert Q ("1" ) == Q (1 )
310+ assert Q ("1/2" ) == Q (1 ,2 )
311+ raises (lambda : Q ("1.0" ), ValueError )
312+ raises (lambda : Q ("1.5" ), ValueError )
313+ raises (lambda : Q ("1/2/3" ), ValueError )
314+ raises (lambda : Q ([]), ValueError )
315+ raises (lambda : Q (1 , []), ValueError )
316+ raises (lambda : Q ([], 1 ), ValueError )
307317 assert bool (Q (0 )) == False
308318 assert bool (Q (1 )) == True
309319 assert Q (1 ,3 ) + Q (2 ,3 ) == 1
@@ -320,11 +330,50 @@ def test_fmpq():
320330 assert Q (2 ,3 ) / flint .fmpz (5 ) == Q (2 ,15 )
321331 assert 5 / Q (2 ,3 ) == Q (15 ,2 )
322332 assert flint .fmpz (5 ) / Q (2 ,3 ) == Q (15 ,2 )
323- assert operator .truediv (Q (2 ,3 ), 5 ) == Q (2 ,15 )
333+ assert Q (2 ,3 )/ 5 == Q (2 ,15 )
334+ assert Q (1 ,2 ) ** 2 == Q (1 ,4 )
335+ assert Q (1 ,2 ) ** - 2 == Q (4 )
336+ raises (lambda : Q (0 ) ** - 1 , ZeroDivisionError )
337+ raises (lambda : Q (1 ,2 ) ** Q (1 ,2 ), TypeError )
338+ raises (lambda : Q (1 ,2 ) ** [], TypeError )
339+ raises (lambda : [] ** Q (1 ,2 ), TypeError )
340+ # XXX: This should NotImplementedError or something.
341+ raises (lambda : pow (Q (1 ,2 ),2 ,3 ), AssertionError )
342+
343+ raises (lambda : Q (1 ,2 ) + [], TypeError )
344+ raises (lambda : Q (1 ,2 ) - [], TypeError )
345+ raises (lambda : Q (1 ,2 ) * [], TypeError )
346+ raises (lambda : Q (1 ,2 ) / [], TypeError )
347+ raises (lambda : [] + Q (1 ,2 ), TypeError )
348+ raises (lambda : [] - Q (1 ,2 ), TypeError )
349+ raises (lambda : [] * Q (1 ,2 ), TypeError )
350+ raises (lambda : [] / Q (1 ,2 ), TypeError )
351+ assert (Q (1 ,2 ) == 1 ) is False
352+ assert (Q (1 ,2 ) != 1 ) is True
353+ assert (Q (1 ,2 ) < 1 ) is True
354+ assert (Q (1 ,2 ) <= 1 ) is True
355+ assert (Q (1 ,2 ) > 1 ) is False
356+ assert (Q (1 ,2 ) >= 1 ) is False
357+ assert (Q (1 ,2 ) == Q (3 ,4 )) is False
358+ assert (Q (1 ,2 ) != Q (3 ,4 )) is True
359+ assert (Q (1 ,2 ) < Q (3 ,4 )) is True
360+ assert (Q (1 ,2 ) <= Q (3 ,4 )) is True
361+ assert (Q (1 ,2 ) > Q (3 ,4 )) is False
362+ assert (Q (1 ,2 ) >= Q (3 ,4 )) is False
363+ assert (Q (1 ,2 ) == Q (1 ,2 )) is True
364+ assert (Q (1 ,2 ) != Q (1 ,2 )) is False
365+ assert (Q (1 ,2 ) < Q (1 ,2 )) is False
366+ assert (Q (1 ,2 ) <= Q (1 ,2 )) is True
367+ assert (Q (1 ,2 ) > Q (1 ,2 )) is False
368+ assert (Q (1 ,2 ) >= Q (1 ,2 )) is True
369+ raises (lambda : Q (1 ,2 ) > [], TypeError )
370+ raises (lambda : [] < Q (1 ,2 ), TypeError )
324371 ctx .pretty = False
325372 assert repr (Q (- 2 ,3 )) == "fmpq(-2,3)"
373+ assert repr (Q (3 )) == "fmpq(3)"
326374 ctx .pretty = True
327375 assert str (Q (- 2 ,3 )) == "-2/3"
376+ assert str (Q (3 )) == "3"
328377 assert Q (2 ,3 ).p == Q (2 ,3 ).numer () == 2
329378 assert Q (2 ,3 ).q == Q (2 ,3 ).denom () == 3
330379 assert + Q (5 ,7 ) == Q (5 ,7 )
@@ -336,6 +385,62 @@ def test_fmpq():
336385 assert raises (lambda : Q (1 ,2 ) / Q (0 ), ZeroDivisionError )
337386 assert raises (lambda : Q (1 ,2 ) / 0 , ZeroDivisionError )
338387
388+ assert Q (5 ,3 ).floor () == flint .fmpz (1 )
389+ assert Q (- 5 ,3 ).floor () == flint .fmpz (- 2 )
390+ assert Q (5 ,3 ).ceil () == flint .fmpz (2 )
391+ assert Q (- 5 ,3 ).ceil () == flint .fmpz (- 1 )
392+ # XXX: Need __floor__ etc.
393+ #
394+ # assert math.floor(Q(5,3)) == flint.fmpz(1)
395+ # assert math.ceil(Q(5,3)) == flint.fmpz(2)
396+ # assert math.trunc(Q(5,3)) == flint.fmpz(2)
397+ # assert round(Q(5,3)) == 2
398+
399+ d = {}
400+ d [Q (1 ,2 )] = 3
401+ d [Q (1 ,2 )] = 4
402+ assert d == {Q (1 ,2 ):4 }
403+
404+ assert Q (- 5 ,3 ).height_bits () == 3
405+ assert Q (- 5 ,3 ).height_bits (signed = True ) == - 3
406+
407+ cases = [
408+ (lambda q : q .next (),
409+ [Q (0 ), Q (1 ), Q (- 1 ), Q (1 ,2 ), Q (- 1 ,2 ), Q (2 ), Q (- 2 ), Q (1 ,3 ), Q (- 1 ,3 ), Q (3 )]),
410+ (lambda q : q .next (signed = False ),
411+ [Q (0 ), Q (1 ), Q (1 ,2 ), Q (2 ), Q (1 ,3 ), Q (3 ), Q (2 ,3 ), Q (3 ,2 ), Q (1 ,4 ), Q (4 )]),
412+ (lambda q : q .next (minimal = False ),
413+ [Q (0 ), Q (1 ), Q (- 1 ), Q (1 ,2 ), Q (- 1 ,2 ), Q (2 ), Q (- 2 ), Q (1 ,3 ), Q (- 1 ,3 ), Q (3 ,2 )]),
414+ (lambda q : q .next (signed = False , minimal = False ),
415+ [Q (0 ), Q (1 ), Q (1 ,2 ), Q (2 ), Q (1 ,3 ), Q (3 ,2 ), Q (2 ,3 ), Q (3 ), Q (1 ,4 ), Q (4 ,3 )]),
416+ ]
417+ for func , values in cases :
418+ for val1 , val2 in zip (values [:- 1 ], values [1 :]):
419+ assert func (val1 ) == val2
420+ raises (lambda : Q (- 1 ).next (signed = False ), ValueError )
421+
422+ OE = OverflowError
423+ cases = [
424+ (flint .fmpq .bernoulli ,
425+ [OE , Q (1 ), Q (- 1 ,2 ), Q (1 ,6 ), Q (0 ), Q (- 1 ,30 )]),
426+ (lambda n : flint .fmpq .bernoulli (n , cache = True ),
427+ [OE , Q (1 ), Q (- 1 ,2 ), Q (1 ,6 ), Q (0 ), Q (- 1 ,30 )]),
428+ (flint .fmpq .harmonic ,
429+ [OE , Q (0 ), Q (1 ), Q (3 ,2 ), Q (11 , 6 ), Q (25 , 12 )]),
430+ (lambda n : flint .fmpq .dedekind_sum (n , 3 ),
431+ [- Q (1 ,18 ), 0 , Q (1 ,18 ), - Q (1 ,18 ), 0 , Q (1 ,18 ), - Q (1 ,18 )]),
432+ ]
433+ is_exception = lambda v : isinstance (v , type ) and issubclass (v , Exception )
434+
435+ for func , values in cases :
436+ for n , val in enumerate (values , - 1 ):
437+ if is_exception (val ):
438+ raises (lambda : func (n ), val )
439+ else :
440+ assert func (n ) == val
441+
442+
443+
339444def test_fmpq_poly ():
340445 Q = flint .fmpq_poly
341446 Z = flint .fmpz_poly
0 commit comments