Return index of for loop



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