Fractals/Mathematics/Period
Finding period of angle under doubling map
How to find period of angle under doubling map
C++ version
/* based on : mndcombi.cpp by Wolf Jung (C) 2010. http://mndynamics.com/indexp.html which is the part of Mandel 5.5 multiplatform C++ GUI program using QT on the same licence as above "The function is computing the preperiod and period (of n/d under doubling map) and setting the denominator to 2^preperiod*(2^period - 1) if possible. So 1/5 becomes 3/15 and 2/10 becomes 3/15 as well. The period is returned as the value of the function, n and d are changed ( Arguments passed to function by reference) and the preperiod is returned in k." (Wolf Jung) Question : if result is >=0 why do not use unsigneg char or unsigned int for type of result ??? */ int normalize(unsigned long long int &n, unsigned long long int &d, int &k) { if (!d) return 0; // d==0 error n %= d; while (!(n & 1) && !(d & 1)) { n >>= 1; d >>= 1; } int p; unsigned long long int n0, n1 = n, d1 = d, np; k = 0; while (!(d1 & 1)) { k++; d1 >>= 1; if (n1 >= d1) n1 -= d1; } n0 = n1; for (p = 1; p <= 65 - k; p++) { twice(n1, d1); if (n1 == n0) break; } if (k + p > 64) return 0; // more then max unsigned long long int np = 1LL; np <<= (p - 1); np--; np <<= 1; np++; //2^p - 1 for p <= 64 n0 = np; d >>= k; n1 = d; if (n1 > n0) { n1 = n0; n0 = d; } while (1) { d1 = n0 % n1; if (!d1) break; n0 = n1; n1 = d1; } //gcd n1 n /= d/n1; n *= np/n1; d = np << k; return p; }
Lisp version
(defun give-period (ratio-angle) "gives period of angle in turns (ratio) under doubling map" (let* ((n (numerator ratio-angle)) (d (denominator ratio-angle)) (temp n)) ; temporary numerator (loop for p from 1 to 100 do (setq temp (mod (* temp 2) d)) ; (2 x n) modulo d = doubling) when ( or (= temp n) (= temp 0)) return p )))
Maxima CAS version
DoublingMap(r):=
block([d,n],
n:ratnumer(r),
d:ratdenom(r),
mod(2*n,d)/d)$
/*
Tests :
GivePeriod (1/7)
3
GivePeriod (1/14)
0
GivePeriod (1/32767)
15
GivePeriod (65533/65535)
16
Gives 0 if :
* not periodic ( preperiodic )
* period >pMax
*/
GivePeriod (r):=
block([rNew, rOld, period, pMax, p],
pMax:100,
period:0,
p:1,
rNew:DoublingMap(r),
while ((p<pMax) and notequal(rNew,r)) do
(rOld:rNew,
rNew:DoublingMap(rOld),
p:p+1
),
if equal(rNew,r) then period:p,
period
);
Haskell version
Haskell version[1]
Conversion from an integer type (Int or Integer) to anything else is done by "fromIntegral". The target type is inferred automatically
-- by Claude Heiland-Allen -- import Data.List (findIndex, groupBy) -- type N = Integer -- type Q = Rational period :: Q -> N period p = let Just i = (p ==) `findIndex` drop 1 (iterate double p) in fromIntegral i + 1
Finding periodic points of quadratic map
f(z,c):=z*z+c;
fn(p, z, c) := if p=0 then z elseif p=1 then f(z,c) else f(fn(p-1, z, c),c);
Standard polynomial
which roots are periodic z-points of period p and its divisors
- math notation :
[2] - Maxima CAS function :
F(p, z, c) := fn(p, z, c) - z ;
Function for computing reduced polynomial
which roots are periodic z-points of period p without its divisors
- math definition :

- Maxima function:
G[p,z,c]:= block( [f:divisors(p), t:1], /* t is temporary variable = product of Gn for (divisors of p) other than p */ f:delete(p,f), /* delete p from list of divisors */ if p=1 then return(F(p,z,c)), for i in f do t:t*G[i,z,c], g: F(p,z,c)/t, return(ratsimp(g)) )$
Finding equations for periodic points
Standard equations
Equation for periodic point for period
is :

so in Maxima :
for i:1 thru 4 step 1 do disp(i,expand(Fn(i,z,c)=0)); 1 z^2-z+c=0 2 z^4+2*c*z^2-z+c^2+c=0 3 z^8+4*c*z^6+6*c^2*z^4+2*c*z^4+4*c^3*z^2+4*c^2*z^2-z+c^4+2*c^3+c^2+c=0 4 z^16+8*c*z^14+28*c^2*z^12+4*c*z^12+56*c^3*z^10+24*c^2*z^10+70*c^4*z^8+60*c^3*z^8+6*c^2*z^8+2*c*z^8+56*c^5*z^6+80*c^4*z^6+ 24*c^3*z^6+8*c^2*z^6+28*c^6*z^4+60*c^5*z^4+36*c^4*z^4+16*c^3*z^4+4*c^2*z^4+8*c^7*z^2+24*c^6*z^2+24*c^5*z^2+16*c^4*z^2+ 8*c^3*z^2- z+c^8+4*c^7+6*c^6+6*c^5+5*c^4+2*c^3+c^2+c=0
Degree of standard equations is 
These equations give periodic points for period p and its divisors. It is because these polynomials are product of lower period polynomials
:
for i:1 thru 4 step 1 do disp(i,factor(Fz(i,z,c))); 1 z^2-z+c 2 (z^2-z+c)*(z^2+z+c+1) 3 (z^2-z+c)*(z^6+z^5+3*c*z^4+z^4+2*c*z^3+z^3+3*c^2*z^2+3*c*z^2+z^2+c^2*z+2*c*z+z+c^3+2*c^2+c+1) 4 (z^2-z+c)*(z^2+z+c+1)(z^12+6*c*z^10+z^9+15*c^2*z^8+3*c*z^8+4*c*z^7+20*c^3*z^6+12*c^2*z^6+z^6+6*c^2*z^5+2*c*z^5+15*c^4*z^4+18*c^3*z^4+3* c^2*z^4+4*c*z^4+4*c^3*z^3+4*c^2*z^3+z^3+6*c^5*z^2+12*c^4*z^2+6*c^3*z^2+5*c^2*z^2+c*z^2+c^4*z+2*c^3*z+c^2*z+2*c*z+c^6+ 3*c^5+3*c^4+3*c^3+2*c^2+1)
so





Standard equations can be reduced to equations
giving periodic points for period p without its divisors.
Reduced equations

so in Maxima gives :
for i:1 thru 5 step 1 do disp(i,expand(G[i,z,c]=0)); 1 z^2-z+c=0 2 z^2+z+c+1=0 3 z^6+z^5+3*c*z^4+z^4+2*c*z^3+z^3+3*c^2*z^2+3*c*z^2+z^2+c^2*z+2*c*z+z+c^3+2*c^2+c+1=0 4 z^12+6*c*z^10+z^9+15*c^2*z^8+3*c*z^8+4*c*z^7+20*c^3*z^6+12*c^2*z^6+z^6+6*c^2*z^5+2*c*z^5+15*c^4*z^4+18*c^3*z^4+ 3*c^2*z^4+4*c*z^4+4*c^3*z^3+4*c^2*z^3+z^3+6*c^5*z^2+12*c^4*z^2+ 6*c^3*z^2+5*c^2*z^2+c*z^2+c^4*z+2*c^3*z+c^2*z+2*c*z+c^6+3*c^5+3*c^4+3*c^3+2*c^2+1=0
Computing periodic points
Fixed points ( period = 1 )
in Maxima :
Define c value
(%i1) c:%i; (%o1) %i
Compute fixed points
(%i2) p:float(rectform(solve([z*z+c=z],[z]))); (%o2) [z=0.62481053384383*%i-0.30024259022012,z=1.30024259022012-0.62481053384383*%i]
Find which is repelling :
abs(2*rhs(p[1]));
Show that sum of fixed points is 1
(%i10) p:solve([z*z+c=z], [z]); (%o10) [z=-(sqrt(1-4*%i)-1)/2,z=(sqrt(1-4*%i)+1)/2] (%i14) s:radcan(rhs(p[1]+p[2])); (%o14) 1
Draw points :
(%i15) xx:makelist (realpart(rhs(p[i])), i, 1, length(p)); (%o15) [-0.30024259022012,1.30024259022012] (%i16) yy:makelist (imagpart(rhs(p[i])), i, 1, length(p)); (%o16) [0.62481053384383,-0.62481053384383] (%i18) plot2d([discrete,xx,yy], [style, points]);
One can add point z=1/2 to the lists:
(%i31) xx:cons(1/2,xx); (%o31) [1/2,-0.30024259022012,1.30024259022012] (%i34) yy:cons(0,yy); (%o34) [0,0.62481053384383,-0.62481053384383] (%i35) plot2d([discrete,xx,yy], [style, points]);
In C :
double complex GiveAlfaFixedPoint(double complex c) { double dx, dy; //The discriminant is the d=b^2- 4ac = dx+dy*i double r; // r(d)=sqrt(dx^2 + dy^2) double sx, sy; // s = sqrt(d) = sqrt((r+dx)/2)+-sqrt((r-dx)/2)*i = sx + sy*i double ax, ay; // alfa = ax+ay*I // d=1-4c = dx+dy*i dx = 1 - 4*creal(c); dy = -4 * cimag(c); // r(d)=sqrt(dx^2 + dy^2) r = sqrt(dx*dx + dy*dy); //sqrt(d) = s =sx +sy*i sx = sqrt((r+dx)/2); sy = sqrt((r-dx)/2); // alfa = ax +ay*i = (1-sqrt(d))/2 = (1-sx + sy*i)/2 ax = 0.5 - sx/2.0; ay = sy/2.0; return ax+ay*I; }
period 2 points
(%i2) solve([(z*z+c)^2+c=z], [z]); (%o2) [z=-(sqrt(-4*c-3)+1)/2,z=(sqrt(-4*c-3)-1)/2,z=-(sqrt(1-4*c)-1)/2,z=(sqrt(1-4*c)+1)/2]
Show that z1+z2 = -1
(%i4) s:radcan(rhs(p[1]+p[2])); (%o4) -1
Show that z2+z3=1
(%i6) s:radcan(rhs(p[3]+p[4])); (%o6) 1
Period 3 points
In Maxima CAS
kill(all);
remvalue(z);
f(z,c):=z*z+c; /* Complex quadratic map */
finverseplus(z,c):=sqrt(z-c);
finverseminus(z,c):=-sqrt(z-c);
/* */
fn(p, z, c) :=
if p=0 then z
elseif p=1 then f(z,c)
else f(fn(p-1, z, c),c);
/*Standard polynomial F_p \, which roots are periodic z-points of period p and its divisors */
F(p, z, c) := fn(p, z, c) - z ;
/* Function for computing reduced polynomial G_p\, which roots are periodic z-points of period p without its divisors*/
G[p,z,c]:=
block(
[f:divisors(p),
t:1], /* t is temporary variable = product of Gn for (divisors of p) other than p */
f:delete(p,f), /* delete p from list of divisors */
if p=1
then return(F(p,z,c)),
for i in f do
t:t*G[i,z,c],
g: F(p,z,c)/t,
return(ratsimp(g))
)$
GiveRoots(g):=
block(
[cc:bfallroots(expand(%i*g)=0)],
cc:map(rhs,cc),/* remove string "c=" */
cc:map('float,cc),
return(cc)
)$
compile(all);
k:G[3,z,c]$
c:1;
s:GiveRoots(ev(k))$
s;
Finding period of orbit
"methods based on interval arithmetic when implemented properly are capable of finding all period-n cycles for considerable large n." (ZBIGNIEW GALIAS )[3]
References
- ↑ lavaurs' algorithm in Haskell with SVG output by Claude Heiland-Allen
- ↑ Numerical Methods for Finding Periodic Orbits at Scholarpedia
- ↑ Rigorous Investigations Of Periodic Orbits In An Electronic Circuit By Means Of Interval Methods by Zbigniew Galias
which roots are periodic z-points of period p and its divisors
