Rationals

Fractions are created in Julia with the double slash operator //. If a fraction is created from Julia integers, a Julia fraction results, and if either the numerator or denominator is an OSCAR integer of type fmpz, an OSCAR fraction of type fmpq results.

Julia has its own parameterised type Rational{T} for its own fractions, where T is the integer type of the numerator and denominator, e.g. Rational{Int} and Rational{BigInt}. Unlike with Int, all of the basic arithmetic operations on Julia's Rational{Int} are checked for overflow in the numerator and denominator.

The field of rationals

The parent of an OSCAR rational number is the field of rationals. It can be constructed from the ring of integers ZZ using the FractionField constructor.

For convenience, QQ is already defined to be the field of rational numbers.

julia> S = FractionField(ZZ)
Rational Field

julia> QQ
Rational Field

Integer constructors

OSCAR rationals can be created using QQ. Two arguments can be passed to specify numerator and denominator. If a single argument is passed, the denominator is set to 1.

For convenience, QQ also accepts Julia integers and rationals, but will always construct an OSCAR rational.

Naturally, Julia's double slash operator can also be used to construct fractions. However, unlike QQ, the double slash operator only constructs an OSCAR rational if either the numerator or denominator is an OSCAR integer.

An exception is raised if a fraction is constructed with denominator zero.

julia> QQ(1, 2)
1//2

julia> QQ(5)
5

julia> ZZ(3)//5
3//5

julia> 1//ZZ(7)
1//7

julia> QQ(2//3)
2//3

julia> ZZ(3)//0
ERROR: DivideError: integer division error

One can also construct the rational number $0$ with the empty constructor:

julia> QQ()
0

The following special constructors are also provided:

  • zero(QQ)
  • one(QQ)
julia> zero(QQ)
0

julia> one(QQ)
1

Predicates

  • iszero(n::fmpq) -> Bool
  • isone(n::fmpq) -> Bool
  • is_unit(n::fmpq) -> Bool

The is_unit function will return true iff $n \neq 0$.

julia> iszero(QQ())
true

julia> isone(one(QQ))
true

julia> is_unit(QQ(-2, 3))
true

Properties

  • numerator(n::fmpq) -> fmpz
  • denominator(n::fmpq) -> fmpz

Return the numerator and denominator respectively, of $n$.

  • sign(n::fmpq) -> fmpq

Return the sign of n, i.e. $n/|n|$ if $n \neq 0$, or $0$ otherwise.

julia> sign(QQ(2, 3))
1

julia> sign(QQ())
0

julia> sign(QQ(-1))
-1
  • abs(n::fmpq) -> fmpq

Return the absolute value of $n$, i.e. $n$ if $n \geq 0$ and $-n$ otherwise.

julia> abs(QQ(-3, 2))
3//2
  • height(n::fmpq) -> fmpz

Return the maximum of the absolute values of the numerator and denominator of $n$.

julia> height(QQ(324987329, -8372492324))
8372492324
  • floor(n::fmpq) -> fmpq

Return the greatest integer $m$ (as a rational number) such that $m \leq n$.

  • ceil(n::fmpq) -> fmpq

Return the least integer $m$ (as a rational number) such that $m \geq n$.

julia> floor(QQ(-2, 3))
-1

julia> ceil(QQ(7, 2))
4

julia> typeof(ans)
fmpq

julia> ceil(QQ(5))
5
  • floor(fmpz, n::fmpq) -> fmpz

Return the greatest integer $m$ such that $m \leq n$.

  • ceil(fmpz, n::fmpq) -> fmpz

Return the least integer $m$ such that $m \geq n$.

julia> floor(fmpz, QQ(-2, 3))
-1

julia> ceil(fmpz, QQ(7, 2))
4

julia> typeof(ans)
fmpz

julia> ceil(fmpz, QQ(5))
5

Basic arithmetic

OSCAR provides the basic arithmetic operations +, - and * and comparison operators ==, !=, <, <=, >, >=, including mixed operations between Julia and OSCAR rationals and integers.

[Exact Division]

  • divexact(a::fmpq, b::fmpq) -> fmpq
  • divexact(a::fmpq, b::Union{fmpz,Base.Integer,Base.Rational}) -> fmpq
  • divexact(a::Union{fmpz,Base.Integer,Base.Rational}, b::fmpq) -> fmpq

Return the quotient of $a$ by $b$. Exact division raises an exception if division by zero is attempted.

julia> divexact(QQ(2, 3), QQ(3, 5))
10//9

julia> divexact(QQ(1, 3), ZZ(0))
ERROR: DivideError: integer division error

julia> divexact(QQ(3, 4), ZZ(5))
3//20

julia> divexact(ZZ(6), QQ(2, 3))
9

julia> divexact(QQ(1, 3), 5)
1//15

Powering

  • ^(a::fmpq, b::Int) -> fmpq

Return the result of powering $a$ by $b$.

julia> QQ(5, 7)^32
23283064365386962890625//1104427674243920646305299201

julia> QQ(1, 2)^(-2)
4

The following is allowed for convenience.

julia> QQ(0)^0
1
Note

In Julia, the rational number $0//1$ when raised to a negative power returns $1//0$ to indicate that the value is undefined. OSCAR raises an exception.

julia> QQ(0)^-2
ERROR: DivideError: integer division error
  • is_power(a::fmpq, b::Int) -> Bool, fmpq

Test if $a$ is an $n$-th power. If so, return true and the root, false and any rational otherwise.

  • is_power(a::fmpq) -> Int, fmpq

Find the largest $n$ such that $a$ is an $n$-th power. Return $n$ and the root.

  • root(a::fmpq, b::Int) -> fmpq

Compute an $n$-th root of $a$, raises an error if $a$ is not an $n$-th power.

julia> is_power(QQ(8), 3)
(true, 2)

julia> is_power(QQ(8), 2)
(false, 8)

julia> is_power(QQ(9//16))
(2, 3//4)

julia> root(QQ(25//9), 2)
5//3