Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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."

share|improve this question
3  
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

2 Answers 2

up vote 2 down vote accepted

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

share|improve this answer

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.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.