4 #include "base/cl_sysdep.h"
7 #include "cln/complex.h"
12 #include "complex/cl_C.h"
20 // Solange b gerade, setze a:=a*a, b:=b/2. [a^b bleibt invariant, = x^y.]
22 // Solange b:=floor(b/2) >0 ist,
23 // setze a:=a*a, und falls b ungerade, setze c:=a*c.
25 // Für y=0: Ergebnis 1.
26 // Für y<0: (/ (expt x (- y))).
29 inline const cl_N expt_pos (const cl_N& x, uintL y)
33 while (!(b % 2)) { a = square(a); b = b >> 1; }
38 if (b % 2) { c = a * c; }
43 const cl_N expt (const cl_N& x, sintL y)
47 // x reell -> schnellere Routine
50 if (y==0) { return 1; } // y=0 -> Ergebnis 1
51 var uintL abs_y = (y<0 ? (uintL)(-y) : y); // Betrag von y nehmen
52 var cl_N z = expt_pos(x,abs_y); // (expt x (abs y))
53 return (y<0 ? recip(z) : z); // evtl. noch Kehrwert nehmen