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