Skip to content

Commit beeca61

Browse files
Merge pull request #292 from oscarbenjamin/pr_fmpq_fmpq
Allow fmpq(fmpq, fmpq) constructor
2 parents 49e2e18 + 98af07c commit beeca61

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

src/flint/test/test_all.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,11 @@ def test_fmpq():
782782
assert Q(-2,-4) == Q(1,2)
783783
assert Q("1") == Q(1)
784784
assert Q("1/2") == Q(1,2)
785+
assert Q(Q(1,2),Q(3,4)) == Q(2,3)
786+
assert Q(1,Q(2,3)) == Q(3,2)
787+
assert Q(Q(1,2),3) == Q(1,6)
788+
assert Q(flint.fmpz(1),Q(2,3)) == Q(3,2)
789+
assert Q(Q(1,2),flint.fmpz(3)) == Q(1,6)
785790
assert raises(lambda: Q("1.0"), ValueError)
786791
assert raises(lambda: Q("1.5"), ValueError)
787792
assert raises(lambda: Q("1/2/3"), ValueError)

src/flint/types/fmpq.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class fmpq(flint_scalar):
1414
@overload
1515
def __init__(self, arg: ifmpq | _str, /) -> None: ...
1616
@overload
17-
def __init__(self, num: ifmpz, den: ifmpz, /) -> None: ...
17+
def __init__(self, num: ifmpq, den: ifmpq, /): ...
1818

1919
@property
2020
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)