Skip to content

Commit be98a9e

Browse files
committed
add tests for fmpz_series
1 parent 81b008e commit be98a9e

File tree

2 files changed

+114
-1
lines changed

2 files changed

+114
-1
lines changed

src/flint/fmpz_series.pyx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,19 @@ cdef class fmpz_series(flint_series):
6868
fmpz_poly_set_list(self.val, [val])
6969
fmpz_poly_truncate(self.val, max(0, self.prec))
7070

71+
def __richcmp__(self, other, int op):
72+
cdef bint r
73+
if op != 2 and op != 3:
74+
raise TypeError("series cannot be ordered")
75+
if not (typecheck(self, fmpz_series) and typecheck(other, fmpz_series)):
76+
return NotImplemented
77+
r = fmpz_poly_equal((<fmpz_series>self).val, (<fmpz_series>other).val)
78+
if r:
79+
r = (<fmpz_series>self).prec == (<fmpz_series>other).prec
80+
if op == 3:
81+
r = not r
82+
return r
83+
7184
def __len__(self):
7285
return fmpz_poly_length(self.val)
7386

test/test.py

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,8 +506,108 @@ def set_bad(i,j):
506506
assert list(M6) == [2,0,0,0,2,1,0,0,2]
507507

508508
def test_fmpz_series():
509+
Zp = flint.fmpz_poly
509510
Z = flint.fmpz_series
510-
Z([1,2])
511+
ctx = flint.ctx
512+
assert ctx.cap == 10
513+
s1 = Z([1,2])
514+
s2 = Z([1,2])
515+
s3 = Z([1,1])
516+
s4 = Z([1,2],11)
517+
p1 = Zp([1,2])
518+
assert (s1 == s2) is True
519+
assert (s1 != s2) is False
520+
assert (s1 == s3) is False
521+
assert (s1 != s3) is True
522+
assert (s1 == s4) is False
523+
assert (s1 != s4) is True
524+
assert (s1 == p1) is False
525+
assert (s1 != p1) is True
526+
assert (Z([1]) == flint.fmpz(1)) is False
527+
assert (Z([1]) != flint.fmpz(1)) is True
528+
assert (Z([1]) == 1) is False
529+
assert (Z([1]) != 1) is True
530+
# XXX: These are invalid power series. Should they compare "equal"?
531+
assert (Z([],-1) == Z([],-1)) is True
532+
assert (Z([],-1) != Z([],-1)) is False
533+
assert (Z([],-2) == Z([],-1)) is True
534+
assert (Z([],-2) != Z([],-1)) is False
535+
assert (Z([],-1) == Z([],-2)) is True
536+
assert (Z([],-1) != Z([],-2)) is False
537+
# XXX: this gives a core dump:
538+
# s = Z([1,2])
539+
# s[10**10] = 1
540+
assert Z([]) == Z([0])
541+
assert Z([1]) != Z([0])
542+
assert Z(Z([1])) == Z([1])
543+
assert Z(Zp([1])) == Z([1])
544+
assert Z(1) == Z([1])
545+
assert raises(lambda: Z([1]) < Z([1]), TypeError)
546+
assert len(Z([1,2])) == 2
547+
assert Z([1,2]).length() == 2
548+
s5 = Z([1,2])
549+
assert s5[1] == 2
550+
assert s5[2] == 0
551+
assert s5[-1] == 0
552+
# XXX: This goes beyond cap. Should it give an error?
553+
assert s5[100] == 0
554+
s5[2] = -1
555+
assert s5[2] == -1
556+
assert s5 == Z([1,2,-1])
557+
def set_bad():
558+
s5[-1] = 3
559+
assert raises(set_bad, ValueError)
560+
assert Z([1,2,0,4]).str() == "1 + 2*x + 4*x^3 + O(x^10)"
561+
assert Z([1,2,0,4]).repr() == "fmpz_series([1, 2, 0, 4], prec=10)"
562+
assert Z([],0).str() == "O(x^0)"
563+
assert Z([],-1).str() == "(invalid power series)"
564+
assert +Z([1,2]) == Z([1,2])
565+
assert -Z([1,2]) == Z([-1,-2])
566+
assert Z([1,2]) + Z([3,4,5]) == Z([4,6,5])
567+
assert Z([1,2]) + 1 == Z([2,2])
568+
assert Z([1,2]) + Zp([3,4,5]) == Z([4,6,5])
569+
assert 1 + Z([1,2]) == Z([2,2])
570+
assert Zp([1,2]) + Z([3,4,5]) == Z([4,6,5])
571+
assert raises(lambda: Z([1,2]) + [], TypeError)
572+
assert raises(lambda: [] + Z([1,2]), TypeError)
573+
assert Z([1,2]) - Z([3,5]) == Z([-2,-3])
574+
assert Z([1,2]) - 1 == Z([0,2])
575+
assert 1 - Z([1,2]) == Z([0,-2])
576+
assert raises(lambda: [] - Z([1,2]), TypeError)
577+
assert raises(lambda: Z([1,2]) - [], TypeError)
578+
assert Z([1,2]) * Z([1,2]) == Z([1,4,4])
579+
assert 2 * Z([1,2]) == Z([2,4])
580+
assert Z([1,2]) * 2 == Z([2,4])
581+
assert raises(lambda: [] * Z([1,2]), TypeError)
582+
assert raises(lambda: Z([1,2]) * [], TypeError)
583+
assert Z([1,2]).valuation() == 0
584+
assert Z([0,2]).valuation() == 1
585+
assert Z([0,0]).valuation() == -1
586+
assert Z([1,1]) / Z([1,-1]) == Z([1,2,2,2,2,2,2,2,2,2])
587+
assert raises(lambda: Z([1,1]) / Z([]), ZeroDivisionError)
588+
assert Z([]) / Z([1,-1]) == Z([])
589+
# quotient would not be a power series
590+
assert raises(lambda: Z([1,1]) / Z([0,1]), ValueError)
591+
# leading term in denominator is not a unit
592+
assert raises(lambda: Z([1,1]) / Z([2,1]), ValueError)
593+
assert Z([0,1,1]) / Z([0,1,-1]) == Z([1,2,2,2,2,2,2,2,2],9)
594+
# XXX: This gives leading term not a unit:
595+
# assert Z([2,4]) / 2 == Z([1,2])
596+
assert Z([1,1]) / -1 == Z([-1,-1])
597+
assert raises(lambda: Z([1,1]) / [], TypeError)
598+
assert raises(lambda: [] / Z([1,1]), TypeError)
599+
assert Z([1,2]) ** 2 == Z([1,4,4])
600+
assert raises(lambda: pow(Z([1,2]), 3, 5), NotImplementedError)
601+
assert Z([1,2])(Z([0,1,2])) == Z([1,2,4])
602+
assert raises(lambda: Z([1,2])(Z([1,2])), ValueError)
603+
assert raises(lambda: Z([1,2])([]), TypeError)
604+
coeffs = [0, 1, -2, 8, -40, 224, -1344, 8448, -54912, 366080]
605+
assert Z([0,1,2]).reversion() == Z(coeffs)
606+
# power series reversion must have valuation 1
607+
assert raises(lambda: Z([1,1]).reversion(), ValueError)
608+
# leading term is not a unit
609+
assert raises(lambda: Z([0,2,1]).reversion(), ValueError)
610+
511611

512612
def test_fmpq():
513613
Q = flint.fmpq

0 commit comments

Comments
 (0)