Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / mroot.cpp
blobf90a154ba5ac739772e0d0f35f9c71dee6208e17
1 //-----------------------------------------------------------------------------
2 //
3 // Bignum root
4 //
5 // Returns null pointer if not perfect root.
6 //
7 // The sign of the radicand is ignored.
8 //
9 //-----------------------------------------------------------------------------
11 #include "stdafx.h"
12 #include "defs.h"
14 unsigned int *
15 mroot(unsigned int *n, unsigned int index)
17 int i, j, k;
18 unsigned int m, *x, *y;
20 if (index == 0)
21 stop("root index is zero");
23 // count number of bits
25 k = 32 * (MLENGTH(n) - 1);
27 m = n[MLENGTH(n) - 1];
29 while (m) {
30 m >>= 1;
31 k++;
34 if (k == 0)
35 return mint(0);
37 // initial guess
39 k = (k - 1) / index;
41 j = k / 32 + 1;
42 x = mnew(j);
43 MSIGN(x) = 1;
44 MLENGTH(x) = j;
45 for (i = 0; i < j; i++)
46 x[i] = 0;
48 while (k >= 0) {
49 mp_set_bit(x, k);
50 y = mpow(x, index);
51 switch (mcmp(y, n)) {
52 case -1:
53 break;
54 case 0:
55 mfree(y);
56 return x;
57 case 1:
58 mp_clr_bit(x, k);
59 break;
61 mfree(y);
62 k--;
65 mfree(x);
67 return 0;