namespace cln {
// Methode:
-// Für y>0:
+// Für y>0:
// a:=x, b:=y.
// Solange b gerade, setze a:=a*a, b:=b/2. [a^b bleibt invariant, = x^y.]
// c:=a.
// Solange b:=floor(b/2) >0 ist,
// setze a:=a*a, und falls b ungerade, setze c:=a*c.
// Ergebnis c.
-// Für y=0: Ergebnis 1.
-// Für y<0: (/ (expt x (- y))).
+// Für y=0: Ergebnis 1.
+// Für y<0: (/ (expt x (- y))).
// Assume y>0.
inline const cl_N expt_pos (const cl_N& x, const cl_I& y)
return expt(x,y);
}
if (eq(y,0)) { return 1; } // y=0 -> Ergebnis 1
- var cl_boolean y_negative = minusp(y);
+ var bool y_negative = minusp(y);
var cl_I abs_y = (y_negative ? -y : y); // Betrag von y nehmen
var cl_N z = expt_pos(x,abs_y); // (expt x (abs y))
return (y_negative ? recip(z) : z); // evtl. noch Kehrwert nehmen