# Can we compile using only Integers Of Unusual Size?

I coined Integers Of Unusual Size to mean "bignum" using GMP, the underpinning of Mathematica's ability to craft very big numbers.

I have these functions from this question:

ascendingQ[x_] := 3 == Mod[x, 4]
uniqueQ[x_] := 0 != Mod[2 x - 1, 3]
uniqueRank[n_, m_] := Block[{a = If[1 != n && OddQ[n], n - 1, n]},
(n + IntegerExponent[a, 2]) 2^m - 1]


The first two need "bignum" inputs and the third needs "bignum" output

And I have this variation of countOrbit which we will use for our research:

totalOrbit[x_] :=
Block[{h = x, t, c = 0, m, n, mt = 0, nt = 0},
While[1 != h,
h = (t = -1 + (3/2)^(m = IntegerExponent[h + 1, 2]) (h + 1))/
2^(n = IntegerExponent[t, 2]);
mt += m;
nt += n;
];
c = 2 mt + nt
]


This needs "bignum" everywhere. When we get a sufficiently frisky totalOrbit I will recast countOrbit.

After I execute the compiled totalOrbit, I get error messages about exceeding machine precision,

cto = Compile[{x}, totalOrbit[x]]


so, I need a way to indicate that all numbers are "bignums."

-
Unfortunately Compile supports only machine-size integers, ruling out bignums. –  kirma Aug 5 '13 at 10:54
@kirma, make that an answer and I will accept it. –  Fred Kline Aug 5 '13 at 11:48

Unfortunately Compile supports only machine-size integers, ruling out bignums.

-

As pointed out in the comments, Compile uses machine numbers only. Also note that IntegerExponent is not a compilable function as can be seen from this example:

f = Compile[{{in, _Integer, 0}}, IntegerExponent[in]];
Needs["CompiledFunctionTools"]
CompilePrint[f]


Note the call to MainEvaluate` in the output. This indicates that the function can not be compiled.

Concerning your top level functions, the switch between bignum and machine integer is opaque in Mathematica. If a calculation needs big integers it will internally switch to such a representation. No action on your part is required for that.

-