NAME
Math::Fraction::Egyptian - construct Egyptian representations of fractions
SYNOPSIS
use Math::Fraction::Egyptian ':all';
my @e = to_egyptian(43, 48); # returns 43/48 in Egyptian format
my @v = to_common(2, 3, 16); # returns 1/2 + 1/3 + 1/16 in common format
DESCRIPTION
From Wikipedia:
An Egyptian fraction is the sum of distinct unit fractions, such as
1/2 + 1/3 + 1/16
That is, each fraction in the expression has a numerator equal to 1 and a denominator that is a positive integer, and all the denominators differ from each other. The sum of an expression of this type is a positive rational number a/b
; for instance the Egyptian fraction above sums to 43/48
.
Every positive rational number can be represented by an Egyptian fraction. Sums of this type, and similar sums also including 2/3
and 3/4
as summands, were used as a serious notation for rational numbers by the ancient Egyptians, and continued to be used by other civilizations into medieval times.
In modern mathematical notation, Egyptian fractions have been superseded by vulgar fractions and decimal notation. However, Egyptian fractions continue to be an object of study in modern number theory and recreational mathematics, as well as in modern historical studies of ancient mathematics.
A common fraction has an infinite number of different Egyptian fraction representations. This module only implements a handful of conversion strategies for conversion of common fractions to Egyptian form; see section STRATEGIES below for details.
FUNCTIONS
to_egyptian($numer, $denom, %attr)
Converts fraction $numer/$denom
to its Egyptian representation.
Example:
my @egypt = to_egyptian(5,9); # converts 5/9
print "@egypt"; # prints FIXME
to_common(@denominators)
Converts an Egyptian fraction into a common fraction.
Example:
my ($num,$den) = to_common(2,5,11); # 1/2 + 1/5 + 1/11 = ?
print "$num/$den"; # prints "87/110"
GCD($x,$y)
Uses Euclid's algorithm to determine the greatest common denominator ("GCD") of $x
and $y
. Returns the GCD.
simplify($n,$d)
Reduces fraction $n/$d
to simplest terms.
Example:
my @x = simplify(25,100); # @x is (1,4)
primes()
Returns a list of all prime numbers below 1000.
prime_factors($n)
Returns the prime factors of $n
as a list of (prime,multiplicity) pairs. The list is sorted by increasing prime number.
Example:
my @pf = prime_factors(120); # 120 = 2 * 2 * 2 * 3 * 5
# @pf = ([2,3],[3,1],[5,1])
decompose($n)
If $n
is a composite number, returns ($p,$q) such that:
* $p != 1
* $q != 1
* $p x $q == $n
sigma(@pairs)
Helper function for determining whether a number is "practical" or not.
STRATEGIES
Fibonacci, in his Liber Abaci, identifies seven different methods for converting common to Egyptian fractions:
The strategies as implemented below have the following features in common:
Each function call has a signature of the form
strategy($numerator, $denominator)
.The return value from a successful strategy call is the list
($numerator, $denominator, @egyptian)
: the new numerator, the new denominator, and zero or more new Egyptian factors extracted from the input fraction.Some strategies are not applicable to all inputs. If the strategy determines that it cannot determine the next number in the expansion, it throws an exception (via
die()
) to indicate the strategy is unsuitable.
s_trivial($n,$d)
Strategy for dealing with "trivial" expansions--if $n
is 1
, then this fraction is already in Egyptian form.
Example:
my @x = s_trivial(1,5); # @x = (0,1,5)
s_small_prime($n,$d)
For a numerator of 2 with odd prime denominator d, one can use this expansion:
2/d = 2/(d + 1) + 2/d(d + 1)
s_practical($n,$d)
Attempts to find a multiplier $M
such that the scaled denominator $M * $d
is a practical number. This lets us break up the scaled numerator $M * $numer
as in this example:
examining 2/9:
9 * 2 is 18, and 18 is a practical number
choose $M = 2
scale 2/9 => 4/18
= 3/18 + 1/18
= 1/6 + 1/18
By definition, all numbers N < P, where P is practical, can be represented as a sum of distinct divisors of P.
s_practical_strict($n,$d)
is_practical($n)
Returns a true value if $n
is a practical number.
s_composite($n,$d)
From Wikipedia:
For composite denominators, factored as p×q, one can expand 2/pq using the identity 2/pq = 1/aq + 1/apq, where a = (p+1)/2. Clearly p must be odd.
For instance, applying this method for d = pq = 21 gives p=3, q=7, and a=(3+1)/2=2, producing the expansion 2/21 = 1/14 + 1/42.
s_greedy($n,$d)
Implements Fibonacci's greedy algorithm for computing Egyptian fractions:
n/d => 1/ceil(d/n) + ((-d)%n)/(d*ceil(d/n))
Example:
# performing the greedy expansion of 3/7:
# ceil(7/3) = 3
# new numerator = (-7)%3 = 2
# new denominator = 7 * 3 = 21
# so 3/7 => 1/3 + 2/21
my ($n,$d,$e) = greedy(2,7);
print "$n/$d ($e)"; # prints "2/21 (3)"
AUTHOR
John Trammell, <johntrammell <at> gmail <dot> com>
BUGS
Please report any bugs or feature requests to bug-math-fraction-egyptian at rt.cpan.org
, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Math-Fraction-Egyptian. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Math::Fraction::Egyptian
You can also look for information at:
GitHub
RT: CPAN's request tracker
http://rt.cpan.org/NoAuth/Bugs.html?Dist=Math-Fraction-Egyptian
AnnoCPAN: Annotated CPAN documentation
CPAN Ratings
Search CPAN
RESOURCES
- http://en.wikipedia.org/wiki/Category:Egyptian_fractions
- http://en.wikipedia.org/wiki/Common_fraction
- http://en.wikipedia.org/wiki/Rhind_Mathematical_Papyrus
- http://en.wikipedia.org/wiki/RMP_2/n_table
- http://en.wikipedia.org/wiki/Liber_Abaci
- http://en.wikipedia.org/wiki/Egyptian_fraction
- http://mathpages.com/home/kmath340/kmath340.htm
- http://mathworld.wolfram.com/RhindPapyrus.html
ACKNOWLEDGEMENTS
Thanks to Project Euler, http://projecteuler.net/, for stretching my mind into obscure areas of mathematics. :-)
COPYRIGHT & LICENSE
Copyright 2008 John Trammell, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 466:
Non-ASCII character seen before =encoding in 'p×q,'. Assuming UTF-8