Skip to content

Commit d7c0f76

Browse files
committed
Allow fmpq(fmpq, fmpq) constructor
1 parent 47e4ba9 commit d7c0f76

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

src/flint/test/test_all.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,11 @@ def test_fmpq():
769769
assert Q(-2,-4) == Q(1,2)
770770
assert Q("1") == Q(1)
771771
assert Q("1/2") == Q(1,2)
772+
assert Q(Q(1,2),Q(3,4)) == Q(2,3)
773+
assert Q(1,Q(2,3)) == Q(3,2)
774+
assert Q(Q(1,2),3) == Q(1,6)
775+
assert Q(flint.fmpz(1),Q(2,3)) == Q(3,2)
776+
assert Q(Q(1,2),flint.fmpz(3)) == Q(1,6)
772777
assert raises(lambda: Q("1.0"), ValueError)
773778
assert raises(lambda: Q("1.5"), ValueError)
774779
assert raises(lambda: Q("1/2/3"), ValueError)

src/flint/types/fmpq.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ class fmpq(flint_scalar):
1313
@overload
1414
def __init__(self, arg: ifmpq | str, /): ...
1515
@overload
16-
def __init__(self, num: ifmpz, den: ifmpz, /): ...
16+
def __init__(self, num: ifmpq, den: ifmpq, /): ...
1717

18-
def __init__(self, arg1: ifmpq | str = 0, arg2: ifmpz = 1, /): ...
18+
def __init__(self, arg1: ifmpq | str = 0, arg2: ifmpq = 1, /): ...
1919

2020
@property
2121
def p(self) -> fmpz: ...

src/flint/types/fmpq.pyx

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,27 @@ cdef class fmpq(flint_scalar):
9494

9595
p2 = any_as_fmpz(p)
9696
if p2 is NotImplemented:
97-
raise TypeError("cannot create fmpq from object of type %s" % type(p))
97+
# Allow fmpq(fmpq, fmpq/fmpz)
98+
p2 = any_as_fmpq(p)
99+
if p2 is NotImplemented:
100+
raise TypeError("cannot create fmpz/fmpq from object of type %s" % type(p))
101+
q2 = any_as_fmpq(q)
102+
if q2 is NotImplemented:
103+
raise TypeError("cannot create fmpz/fmpq from object of type %s" % type(q))
104+
p3 = p2 / q2
105+
fmpq_set(self.val, (<fmpq>p3).val)
106+
return
107+
98108
q2 = any_as_fmpz(q)
99109
if q2 is NotImplemented:
100-
raise TypeError("cannot create fmpq from object of type %s" % type(q))
110+
# fmpq(fmpz, fmpq)
111+
q2 = any_as_fmpq(q)
112+
if q2 is NotImplemented:
113+
raise TypeError("cannot create fmpz/fmpq from object of type %s" % type(q))
114+
p3 = p2 / q2
115+
fmpq_set(self.val, (<fmpq>p3).val)
116+
return
117+
101118
if fmpz_is_zero((<fmpz>q2).val):
102119
raise ZeroDivisionError("cannot create rational number with zero denominator")
103120

0 commit comments

Comments
 (0)