4 #include "base/cl_sysdep.h"
7 #include "cln/integer.h"
14 const cl_I expt_pos (const cl_I& x, uintL y)
17 // a:=x, b:=y, c:=1. [a^b*c bleibt invariant, = x^y.]
19 // falls b ungerade, setze c:=a*c,
20 // setze b:=floor(b/2),
22 // Wenn b=1, setze c:=a*c.
26 // Solange b gerade, setze a:=a*a, b:=b/2. [a^b bleibt invariant, = x^y.]
28 // Solange b:=floor(b/2) >0 ist,
29 // setze a:=a*a, und falls b ungerade, setze c:=a*c.
36 { if (b % 2) // b ungerade?
38 b = b >> 1; // b := (floor b 2)
45 while (!(b % 2)) { a = square(a); b = b >> 1; }
50 if (b % 2) { c = a * c; }
55 // Bit complexity (x of length N): O(M(N*y)).