Hi,
doubling_map(n,d):=mod(2*n,d);
So here a 3 functions :
/* catch-throw version by Stavros Macrakis, works */
GivePeriodOfAngle(n0,d):=
catch(
block([ni:n0],
for i thru 200 do if (ni:doubling_map(ni,d))=n0 then throw(i),
0 ) )$
/* go-loop version, works */
GiveP(n0,d):=block(
[ni:n0,i:0],
block(
loop,
ni:doubling_map(ni,d),
i:i+1,
if i<100 and not (n0=ni) then go(loop)
),
if (n0=ni)
then i
else 0
);
/* Barton Willis while version without for loop , works */
GivePeriod(n0,d):=block([ni : n0,k : 1],
while (ni : doubling_map(ni,d)) # n0 and k < 100 do (
k : k + 1),
if k = 100 then 0 else k)$
All works :
(%i10) p:GivePeriodOfAngle(39,63);
p:GivePeriodOfAngle(39,63);
GiveP(39,63);
(%o10) 6
(%o11) 6
(%o12) 6
(%i13) p:GivePeriodOfAngle(27,31);
p:GivePeriodOfAngle(27,31);
GiveP(27,31);
(%o13) 5
(%o14) 5
(%o15) 5
(%i16) p:GivePeriodOfAngle(1,310000);
p:GivePeriodOfAngle(1,310000);
GiveP(1,310000);
(%o16) 0
(%o17) 0
(%o18) 0
Thx
Adam
PS ( example angles and periods are:
http://fraktal.republika.pl/mset_external_ray.html