diff --git a/tests/rationalGeo.pl b/tests/rationalGeo.pl new file mode 100755 index 0000000..12956bc --- /dev/null +++ b/tests/rationalGeo.pl @@ -0,0 +1,99 @@ +#!/usr/bin/env perl + +# Preexperiments to rational geometry + +use strict; +use warnings; + +use Math::Trig; + +# generate rational approximations to nth parts of an arc represented by sin and cos +# approach leads to values in principal usable as first iteration, but has vastly to big numbers +sub nthArc { + my $n = shift; + # basis triangle with half the angle + my $prex = $n; + my $prey = 1; + dumpangles("pre", $prex, $prey, 45/$n); + # complex multiplication, double the angle + my $x = $prex*$prex - $prey*$prey; + my $y = 2*$prex*$prey; + dumpangles("square", $x, $y, 90/$n); + my $npowx = 1; + my $npowy = 0; + for(1..$n) { + my $nnpowx = $x*$npowx - $y*$npowy; + my $nnpowy = $x*$npowy + $y*$npowx; + $npowx = $nnpowx; + $npowy = $nnpowy; + } + dumpangles("n-powered", $npowx, $npowy, 90); +} + +sub dumpangles { + my ($name, $x, $y, $compare) = @_; + my $goal = ""; + $goal = " (goal: $compare)" if $compare;; + my $phi = atan2($y,$x)/pi*180; + print "[$name] $x $y -- $phi$goal\n"; +} + +# exp is +# sum_n=0..inf x^n/n! + +# 1/0! - x^2/2! + x^4/4! - x^6/6! +sub preCos { + my ($steps, $x) = @_; + my $mxsq = -$x*$x; + my $sum = 0; + my $fa = 1; + for(1..$steps) { + my $step2 = $_ * 2; + $sum += $fa; + $fa *= $mxsq/($step2*($step2-1)) + } + return $sum +} + +# x/1! - x^3/3! + x^5/5! - x^7/7! +sub preSin { + my ($steps, $x) = @_; + my $mxsq = -$x*$x; + my $sum = 0; + my $fa = $x; + for(1..$steps) { + my $step2 = $_ * 2; + $sum += $fa; + $fa *= $mxsq/($step2*($step2+1)) + } + return $sum +} + + +while(<>) { +# if(m#^([1-9][0-9]*)$#) { +# nthArc($1) +# } else { +# print "Bad parameter\n"; +# } + if(m#^([1-9][0-9]*)\s+([0-9\.]+)$#) { + my ($st, $x) = ($1, $2); + my $c = cos($x); + my $cappr = preCos($st, $x); + print "$x -- c:$c cappr:$cappr\n"; + my $s = sin($x); + my $sappr = preSin($st, $x); + print "$x -- s:$s sappr:$sappr\n"; + } elsif(m#pi\s+([0-9]+)\s+([0-9]+)#) { + my ($bigit, $smallit) = ($1, $2); + my $pi = 22/7; + for(1..$bigit) { + $pi = $pi + preSin($smallit, $pi); + } + print "piappr: $pi -- truepu: ", pi, "\n" + } else { + print "Bad parameters\n"; + } +} + +