#include "cl_sysdep.h"
// Specification.
-#include "cl_numtheory.h"
+#include "cln/numtheory.h"
// Implementation.
-#include "cl_abort.h"
+#include "cln/exception.h"
#include "cl_xmacros.h"
+namespace cln {
+
// Assume 0 <= a < b.
-inline int jacobi_aux (uint32 a, uint32 b)
+inline int jacobi_aux (uintV a, uintV b)
{
var int v = 1;
for (;;) {
switch (b % 4) {
case 1: break;
case 3: v = -v; break;
- default: cl_abort();
+ default: throw runtime_exception();
}
continue;
}
switch (b % 8) {
case 1: case 7: break;
case 3: case 5: v = -v; break;
- default: cl_abort();
+ default: throw runtime_exception();
}
continue;
}
// law (a/b) = (-1)^((a-1)/2)((b-1)/2) * (b/a).
if ((a & b & 3) == 3)
v = -v;
- swap(sint32, a,b);
+ swap(uintV, a,b);
// Now a > 2*b, set a := a mod b.
if ((a >> 3) >= b)
a = a % b;
}
}
-int jacobi (sint32 a, sint32 b)
+int jacobi (sintV a, sintV b)
{
// Check b > 0, b odd.
if (!(b > 0))
- cl_abort();
+ throw runtime_exception();
if ((b & 1) == 0)
- cl_abort();
+ throw runtime_exception();
// Ensure 0 <= a < b.
if (a >= 0)
- a = (uint32)a % (uint32)b;
+ a = (uintV)a % (uintV)b;
else
- a = b-1-((uint32)(~a) % (uint32)b);
+ a = b-1-((uintV)(~a) % (uintV)b);
return jacobi_aux(a,b);
}
+
+} // namespace cln