utils/naf.c: Non-adjacent form calculator, from math/mpreduce.c.
[u/mdw/catacomb] / utils / naf.c
CommitLineData
7d55d5b0
MW
1#include <stdio.h>
2#include <stdlib.h>
3
4#include "mp.h"
5#include "mptext.h"
6
7
8int main(int argc, char *argv[])
9{
10 mp *x;
11 mpscan sc;
12 unsigned long d, i;
13 enum { Z = 0, Z1 = 2, X = 4, X0 = 6 };
14 unsigned st = Z;
15
16 x = mp_readstring(MP_NEW, argv[1], 0, 0);
17 d = mp_bits(x);
18
19 for (i = 0, mp_scan(&sc, x); mp_step(&sc); i++) {
20 switch (st | mp_bit(&sc)) {
21 case Z | 1: st = Z1; break;
22 case Z1 | 0: st = Z; printf("+ %lu\n", i - 1); break;
23 case Z1 | 1: st = X; printf("- %lu\n", i - 1); break;
24 case X | 0: st = X0; break;
25 case X0 | 1: st = X; printf("- %lu\n", i - 1); break;
26 case X0 | 0: st = Z; printf("+ %lu\n", i - 1); break;
27 }
28 }
29 if (st >= X) printf("+ %lu\n", i - 1);
30}