diff --git a/Manticore/Num/ContinuedFraction.pm b/Manticore/Num/ContinuedFraction.pm new file mode 100644 index 0000000..5f6f039 --- /dev/null +++ b/Manticore/Num/ContinuedFraction.pm @@ -0,0 +1,41 @@ +package Manticore::Num::ContinuedFraction; + +# lazy and potential infinite continued fraction + +use strict; +use warnings; + +use Math::BigRat; + +# Approximation object: +# { +# a => BigRat, this integer +# r => remainder, input number; undef if fraction has ended +# c => child, better approximation (or undef) +# e => end of list? +# } +sub new { + my ($pkg, $x) = @_; + die "ContinuedFraction can only be constructed of positive numbers!" if $x<0; + my $prop = int $x; + if(0 == $prop) { + return undef; # TODO + } + my $rem = $x - $prop; + return bless { + a => $prop, + r => $rem, + } +} + +sub child { + my $self = shift; + if(not $self->{c}) { + my ($a, $r) = @{$self}{qw(a r)}; + my $c = Manticore::Num::ContinuedFraction->new(1/$r); + $self->{c} = $c; + } + return $self->{c} +} + +1; diff --git a/tests/testCf.pl b/tests/testCf.pl new file mode 100755 index 0000000..97a4117 --- /dev/null +++ b/tests/testCf.pl @@ -0,0 +1,20 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use Math::Trig; +use Data::Dumper; + +BEGIN { + push @INC, '..' +} + +use Manticore::Num::ContinuedFraction; + +my $pi = Manticore::Num::ContinuedFraction->new(pi); + +print $pi->child(); + +print Data::Dumper::Dumper($pi); +