From 4158a1ad28823f9858c2d196fc0152e9968c5071 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Tue, 6 Aug 2013 19:37:34 +0100 Subject: [PATCH] utils/naf.c: Wrap up the state machine correctly. The old code just assumed a particular resulution (in particular, the `X' case), which is far from universally applicable. Now we simulate up to two more steps, feeding in zero bits. --- utils/naf.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/utils/naf.c b/utils/naf.c index 550a271..f6c5771 100644 --- a/utils/naf.c +++ b/utils/naf.c @@ -18,13 +18,16 @@ int main(int argc, char *argv[]) for (i = 0, mp_scan(&sc, x); mp_step(&sc); i++) { switch (st | mp_bit(&sc)) { - case Z | 1: st = Z1; break; - case Z1 | 0: st = Z; printf("+ %lu\n", i - 1); break; - case Z1 | 1: st = X; printf("- %lu\n", i - 1); break; - case X | 0: st = X0; break; - case X0 | 1: st = X; printf("- %lu\n", i - 1); break; - case X0 | 0: st = Z; printf("+ %lu\n", i - 1); break; + case Z | 1: st = Z1; printf("\t-> Z1\n"); break; + case Z1 | 0: st = Z; printf("+ %lu\t-> Z\n", i - 1); break; + case Z1 | 1: st = X; printf("- %lu\t-> X\n", i - 1); break; + case X | 0: st = X0; printf("\t-> X0\n"); break; + case X0 | 1: st = X; printf("- %lu\t-> X\n", i - 1); break; + case X0 | 0: st = Z; printf("+ %lu\t-> Z\n", i - 1); break; } } - if (st >= X) printf("+ %lu\n", i - 1); + switch (st) { + case Z1: case X0: printf("+ %lu\n", i - 1); break; + case X: printf("+ %lu\n", i); break; + } } -- 2.11.0