More continued fraction numeric and more tests.

This commit is contained in:
Stephan Barth 2023-12-28 13:01:16 +01:00
parent 0f1c43023e
commit 7049ec6a11
3 changed files with 65 additions and 9 deletions

View File

@ -6,6 +6,7 @@ use strict;
use warnings; use warnings;
use Math::BigRat; use Math::BigRat;
use Data::Dumper;
### Methods and constructor ### Methods and constructor
# Approximation object: # Approximation object:
@ -19,9 +20,9 @@ sub new {
my ($pkg, $x) = @_; my ($pkg, $x) = @_;
die "ContinuedFraction can only be constructed of positive numbers!" if $x<0; die "ContinuedFraction can only be constructed of positive numbers!" if $x<0;
my $prop = int $x; my $prop = int $x;
if(0 == $prop) { #if(0 == $prop) {
return undef; # TODO # return undef; # TODO
} #}
my $rem = $x - $prop; my $rem = $x - $prop;
return bless { return bless {
a => $prop, a => $prop,
@ -85,9 +86,13 @@ sub reconstruct {
# round to bigRat with ContinuedFraction of $steps parts # round to bigRat with ContinuedFraction of $steps parts
sub roundSteps { sub roundSteps {
my ($steps, $x) = @_; my ($steps, $x) = @_;
my $cf = Manticore::Num::ContinuedFraction->new($x); #print "[[ $steps -- $x ]]\n";
return Math::BigRat->new(0) if 0==$x;
my $sgn = $x < 0 ? -1 : 1;
my $cf = Manticore::Num::ContinuedFraction->new($sgn*$x);
#print Data::Dumper::Dumper($cf);
my $l = $cf->firstk($steps); my $l = $cf->firstk($steps);
return reconstruct($l); return reconstruct($l)*$sgn;
} }
1; 1;

View File

@ -3,6 +3,9 @@ package Manticore::Num::Trig;
use strict; use strict;
use warnings; use warnings;
use Math::BigRat lib => 'GMP';
# Sin, cos, first terms
# 1/0! - x^2/2! + x^4/4! - x^6/6! # 1/0! - x^2/2! + x^4/4! - x^6/6!
sub proxCos { sub proxCos {
my ($steps, $x) = @_; my ($steps, $x) = @_;
@ -31,4 +34,36 @@ sub proxSin {
return $sum return $sum
} }
# sin,cos, first terms and round by continued fractions
# 1/0! - x^2/2! + x^4/4! - x^6/6!
sub proxCosCF {
my ($steps, $x) = @_;
my $round = sub { Manticore::Num::ContinuedFraction::roundSteps($steps, $_[0]) };
my $mxsq = $round->(-$x*$x);
my $sum = 0;
my $fa = 1;
for(1..$steps) {
my $step2 = $_ * 2;
$sum = $round->($sum+$fa);
$fa = $round->($fa*$mxsq/($step2*($step2-1)))
}
return $sum
}
# x/1! - x^3/3! + x^5/5! - x^7/7!
sub proxSinCF {
my ($steps, $x) = @_;
my $round = sub { Manticore::Num::ContinuedFraction::roundSteps($steps, $_[0]) };
my $mxsq = $round->(-$x*$x);
my $sum = 0;
my $fa = $x;
for(1..$steps) {
my $step2 = $_ * 2;
$sum = $round->($sum+$fa);
$fa = $round->($fa*$mxsq/($step2*($step2+1)))
}
return $sum
}
1; 1;

View File

@ -16,10 +16,10 @@ use Manticore::Num::ContinuedFraction;
my $pi = Math::BigRat->new(3); my $pi = Math::BigRat->new(3);
my $poly = 30; my $poly = 10;
for(1..5) { for(1..5) {
$pi = $pi + Manticore::Num::Trig::proxSin($poly,$pi); $pi = $pi + Manticore::Num::Trig::proxSinCF($poly,$pi);
print "===\ns: $pi\n"; print "===\ns: $pi\n";
$pi = Manticore::Num::ContinuedFraction::roundSteps($poly,$pi); $pi = Manticore::Num::ContinuedFraction::roundSteps($poly,$pi);
print "r: $pi\n"; print "r: $pi\n";
@ -27,7 +27,7 @@ print "r: $pi\n";
my $pi1 = Manticore::Num::ContinuedFraction->new($pi); my $pi1 = Manticore::Num::ContinuedFraction->new($pi);
$pi = $pi + Manticore::Num::Trig::proxSin($poly+2,$pi); $pi = $pi + Manticore::Num::Trig::proxSinCF($poly+2,$pi);
print "===\ns: $pi\n"; print "===\ns: $pi\n";
$pi = Manticore::Num::ContinuedFraction::roundSteps($poly,$pi); $pi = Manticore::Num::ContinuedFraction::roundSteps($poly,$pi);
print "r: $pi\n"; print "r: $pi\n";
@ -38,7 +38,23 @@ my $pi2 = Manticore::Num::ContinuedFraction->new($pi);
# #
#print Data::Dumper::Dumper($pi); #print Data::Dumper::Dumper($pi);
my $c = $pi1->commonk($pi2, 25); my $c = $pi1->commonk($pi2, 2500);
print "[[ @$c ]]\n"; print "[[ @$c ]]\n";
#my $max = 1;
#for(1..200000) {
# my $r = Manticore::Num::ContinuedFraction->new(rand 1);
# my $l = $r->firstk(50);
# for(@$l) { $max = $_ if $_>$max }
# print "[[ @$l ]]\n";
#}
#print "M: $max\n";
while(<>) {
my $cf = Manticore::Num::ContinuedFraction::roundSteps(10,$_);
my $f = Math::BigRat->new(0+$_);
my $r = Math::BigRat->new($_);
print "$cf $f $r\n";
}