A Pythagorean Triple is a list of three positive integers
In this module, a PythagoreanTriple
is a container that holds three such integers
with the additional property that
A Pythagorean triple can be constructed simply by specifying the lengths of the legs and hypotenuse of a right triangle
julia> using PythagoreanTriples
julia> T = PythagoreanTriple(4,3,5)
PythagoreanTriple(3, 4, 5)
If the three integers are not the side lengths of a right triangle, an error is thrown:
julia> T = PythagoreanTriple(4,5,6)
ERROR: (4, 5, 6) does not define a Pythagorean triple
In addition, the three side lengths can be given as a tuple:
julia> abc = (4,3,5)
(4, 3, 5)
julia> PythagoreanTriple(abc)
PythagoreanTriple(3, 4, 5)
Pythagorean triples can be created from a pair of integers u,v
in which the
legs of the right triangle are abs(u^2 - v^2)
and abs(2*u*v)
, and the hypotenuse is
u^2 + v^2
.
A user can give the values u
and v
to create a Pythagorean triple:
julia> T = PythagoreanTriple(2,5)
PythagoreanTriple(20, 21, 29)
Note that the integers u
and v
must be distinct and nonzero:
julia> PythagoreanTriple(0,5)
ERROR: (0, 5) does not yield a PythagoreanTriple
julia> PythagoreanTriple(2,2)
ERROR: (2, 2) does not yield a PythagoreanTriple
We call a Pythagorean triple (a,b,c)
primitive provided gcd(a,b) == 1
.
Thus (3,4,5)
is primitive but (6,8,10)
is not.
Use TripleGenerator
to create an iterator for primitive Pythagorean triples. The
iterator TripleGenerator(n)
will create n
primitive triples:
julia> for t in TripleGenerator(5)
println(t)
end
PythagoreanTriple(3, 4, 5)
PythagoreanTriple(5, 12, 13)
PythagoreanTriple(8, 15, 17)
PythagoreanTriple(7, 24, 25)
PythagoreanTriple(20, 21, 29)
If n
is omitted (or negative) the iterator will produce values endlessly.
For example:
julia> for t in TripleGenerator()
a,b,c = make_tuple(t)
if a > 1000
println(t)
break
end
end
PythagoreanTriple(1007, 1224, 1585)
Note: The function is_primitive
is available to check if a Pythagorean triple
is primitive:
julia> t = PythagoreanTriple(3,4,5)
PythagoreanTriple(3, 4, 5)
julia> is_primitive(t)
true
julia> t = PythagoreanTriple(30,40,50)
PythagoreanTriple(30, 40, 50)
julia> is_primitive(t)
false
The function make_primitive
takes a Pythagorean triple and returns a new
triple having divided the three numbers by their greatest common divisor.
julia> t = PythagoreanTriple(6,8,10)
PythagoreanTriple(6, 8, 10)
julia> make_primitive(t)
PythagoreanTriple(3, 4, 5)
Pythagorean triples can be multiplied (on the left) by a positive integer. For example:
julia> p = PythagoreanTriple(5,12)
PythagoreanTriple(119, 120, 169)
julia> 10p
PythagoreanTriple(1190, 1200, 1690)
All primitive Pythagorean triples (and some, but not all, non-primitive triples)
can be constructed using two parameters p = PythagoreanTriple(u,v)
.
Given such a triple, the function get_parameters
will return a u
and v
that
creates that triple.
julia> p = PythagoreanTriple(5,12,13)
PythagoreanTriple(5, 12, 13)
julia> u,v = get_parameters(p)
(2, 3)
julia> PythagoreanTriple(u,v)
PythagoreanTriple(5, 12, 13)
While some non-primitive triples, such as (6,8,10)
, can be created this way, others,
such as (30,40,50)
, cannot:
julia> p = get_parameters(6,8,10)
(1, 3)
julia> get_parameters(30,40,50)
ERROR: Unable to find parameters for (30, 40, 50) (non-primitive)
The function make_tuple
returns a 3-tuple containing the three values:
julia> t = PythagoreanTriple(5,11)
PythagoreanTriple(96, 110, 146)
julia> make_tuple(t)
(96, 110, 146)
Pythagorean triples can be compared using the usual <
, <=
, >
, >=
relations.
Lists of triples can be sorted. They are sorted "reverse lexicographically". That is
when we check if (a,b,c)
is less than or equal to (aa,bb,cc)
we first see if c ≤ cc
.
If so, then if b ≤ bb
. And if so, then if a ≤ aa
.
julia> list = collect(TripleGenerator(10))
10-element Vector{Any}:
PythagoreanTriple(3, 4, 5)
PythagoreanTriple(5, 12, 13)
PythagoreanTriple(8, 15, 17)
PythagoreanTriple(7, 24, 25)
PythagoreanTriple(20, 21, 29)
PythagoreanTriple(9, 40, 41)
PythagoreanTriple(12, 35, 37)
PythagoreanTriple(11, 60, 61)
PythagoreanTriple(28, 45, 53)
PythagoreanTriple(33, 56, 65)
julia> sort(list)
10-element Vector{Any}:
PythagoreanTriple(3, 4, 5)
PythagoreanTriple(5, 12, 13)
PythagoreanTriple(8, 15, 17)
PythagoreanTriple(7, 24, 25)
PythagoreanTriple(20, 21, 29)
PythagoreanTriple(12, 35, 37)
PythagoreanTriple(9, 40, 41)
PythagoreanTriple(28, 45, 53)
PythagoreanTriple(11, 60, 61)
PythagoreanTriple(33, 56, 65)