       Mathematica to C

• To: mathgroup at smc.vnet.net
• Subject: [mg3646] Mathematica to C
• From: tph1001 at cus.cam.ac.uk (T.P Harte)
• Date: Sun, 31 Mar 1996 00:52:06 -0500
• Organization: University of Cambridge, England
• Sender: owner-wri-mathgroup at wolfram.com

```I have some software written in Mathematica [see the example below] and was
wondering if anything exists to convert it into C?

Obviously, I'm faced with the possibility of using a lot more
Mathematica stuff than what I have included and an automated
conversion program/script would be very helpful.

Thanks, Thomas.

+------------------------------------------------------------+
|       Thomas Harte,          ---    ``All music is for   |
| University of Cambridge,    + | +     the glory of God   |
|     (Wolfson College)     |---o---|   and the betterment |
| Medical Informatics Unit    + | +          of Man''      |
|    ++44 1223 330306/5/4      ---      J.S.Bach 1685-1750 |
+------------------------------------------------------------+

(* numberth.m *)
(* Last updated August 8th 1995 *)

n = 8;                                (* transform length *)
l = 2^32;                             (* computer's word length *)

inv[n_Integer] := PowerMod[n, -1, m]  (* inverse function *)

init[] :=                             (* init variables *)
Block[{},
k = Floor[l/n]-1;
While[PrimeQ[k*n+1] == False, k--];
m= k*n+1;                           (* the prime modulo *)
r=PrimitiveRoot[m];                 (* primitive root of m *)
w=PowerMod[r, k, m];                (* root of order n, is r^((m-1)/n) *)
w1=inv[w];                          (* inverse of w *)
];

initf[] :=                            (* init transform matrixes *)
Block[{},
f=Table[PowerMod[w, i j, m], {i, 0, n-1}, {j, 0, n-1}];       (* transform *)
f1=Table[PowerMod[w1, i j, m], {i, 0, n-1}, {j, 0, n-1}];     (* inverse *)
f1 = Mod[inv[n] * f1, m];
];

carry[l_List] :=                      (* convert list to number *)
Block[{s = 0},
For[k=Length[l], k > 0, k--, s=s*10+l[[k]]];
Return[s]];

n2l[a_Integer] :=                     (* convert number to list *)
Join[Reverse[IntegerDigits[a]], Table[0, {n-1-Floor[Log[10, a]]}]];

mulf[a_Integer, b_Integer] :=         (* multiply with slow algorithm *)
carry[Mod[f1.(Mod[f.n2l[a], m]*Mod[f.n2l[b], m]), m]];

mul[a_Integer, b_Integer] :=          (* multiply with fast algorithm *)
carry[ifnt[Mod[fnt[n2l[a]] * fnt[n2l[b]], m]]];

permute[a_Integer] :=                 (* bit reversal *)
Block[{t = 2 * n, o = 2 * a, p = 0},
While[(t /= 2) > 1, p += p + Mod[(o = Floor[o / 2]), 2]];
Return[p]];

scramble[l_List] :=                   (* bit reverse list order *)
Table[l[[permute[k]+1]], {k, 0, n-1}];

fnt[l_List] :=                        (* fast number theoretic transform *)
Block[{f = l, i1, i2, i3, i4, loop, loop1, loop2, a, b, y, z},
y = w1;

i1 = n / 2;
i2 = 1;

For[loop = i1, loop > 0, loop = Floor[loop / 2],
Block[{},
i3 = 0;
i4 = i1;
For[loop1 = 0, loop1 < i2, loop1++,
Block[{},
z = 1;
For[loop2 = i3, loop2 < i4, loop2++,
Block[{},
a = f[[loop2 + 1]];
b = f[[loop2 + i1+ 1]];
f[[loop2 + 1]] = Mod[a + b, m];
f[[loop2 + i1 + 1]] = Mod[z * (a - b), m];
z = Mod[z * y, m]]];
i3 += 2 * i1;
i4 += 2 * i1]];
y = Mod[y * y, m];
i1 = Floor[i1 / 2];
i2 *= 2]];
Return[f]]

ifnt[l_List] :=                       (* inverse fnt *)
Block[{f = l, i, j, k, istep, mmax, wt, wr, wtemp},
mmax = 1;
While[n > mmax,
Block[{},
istep = 2 * mmax;
wt = PowerMod[w, n / istep, m];
wr = 1;
For[k = 0, k < mmax, k++,
Block[{},
For[i = k, i < n, i += istep,
Block[{},
j = i + mmax;
wtemp = Mod[wr * f[[j + 1]], m];
f[[j + 1]] = Mod[f[[i + 1]] - wtemp, m];
f[[i + 1]] = Mod[f[[i + 1]] + wtemp, m]]];
wr = Mod[wr * wt, m]]];
mmax = istep]];
Return[Mod[inv[n] * f, m]]]

fntraw[l_List] := scramble[fnt[l]];                     (* for debug only *)
ifntraw[l_List] := Mod[ifnt[scramble[l]] n, m];         (* for debug only *)

(* end numberth.m *)

==== [MESSAGE SEPARATOR] ====

```

• Prev by Date: Re: A simple question?
• Next by Date: Re: Creating and Opening Files on a Mac...
• Previous by thread: Re: substitue expression for function f as argument in mma