update:= proc(z,a,b) global p,g,beta; local zz,aa,bb; aa:=a: bb:=b: if z
2*p/3 then zz:=z*g mod p; aa:=a+1 mod(p-1)
else zz:=z*z mod p; aa:=2*a mod (p-1); bb:=2*b mod (p-1)
end if:
(zz,aa,bb):
end proc:
p:=971; beta:=564 ; g:=43; # INPUT VALUES; g should be primitive mod p
a0:=0; b0:=0; aX:=a0: bX:=b0:
aY:=a0: bY:=b0: # INITIALIZATION
x:=g &^aX * beta&^bX mod p:
y:=g &^aY * beta&^bY mod p:
UB:=10^3: # UPPER BOUND ON NO. OF ITERATIONS
(x,aX,bX):=update(x,aX,bX):
(y,aY,bY):=update(y,aY,bY):
(y,aY,bY):=update(y,aY,bY):
i:=1: # ONE ROUND OUT OF LOOP
while not(x=y) and i