* (c) 2004 Straylight/Edgeware
*/
-/*----- Licensing notice --------------------------------------------------*
+/*----- Licensing notice --------------------------------------------------*
*
* This file is part of Catacomb.
*
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
- *
+ *
* Catacomb is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Library General Public
* License along with Catacomb; if not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
instr_v iv = DA_INIT;
unsigned long d, i;
unsigned op;
- size_t w, b;
+ size_t w, b, bb;
/* --- Fill in the easy stuff --- */
for (i = 0, mp_scan(&sc, p); 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 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 X0 | 1: st = X; printf("- %lu\n", i - 1); break;
+ case X0 | 0: st = Z; printf("+ %lu\n", i - 1); break;
}
}
if (st >= X) printf("+ %lu\n", i - 1);
st = Z;
#endif
+ bb = MPW_BITS - (d + 1)%MPW_BITS;
for (i = 0, mp_scan(&sc, p); i < d && mp_step(&sc); i++) {
switch (st | mp_bit(&sc)) {
case Z | 1: st = Z1; break;
- case Z1 | 0: st = Z; op = MPRI_SUB; goto instr;
- case Z1 | 1: st = X; op = MPRI_ADD; goto instr;
+ case Z1 | 0: st = Z; op = MPRI_SUB; goto instr;
+ case Z1 | 1: st = X; op = MPRI_ADD; goto instr;
case X | 0: st = X0; break;
- case X0 | 1: st = X; op = MPRI_ADD; goto instr;
- case X0 | 0: st = Z; op = MPRI_SUB; goto instr;
+ case X0 | 1: st = X; op = MPRI_ADD; goto instr;
+ case X0 | 0: st = Z; op = MPRI_SUB; goto instr;
instr:
w = (d - i)/MPW_BITS + 1;
- b = (MPW_BITS + i - d - 1)%MPW_BITS;
+ b = (bb + i)%MPW_BITS;
INSTR(op | !!b, w, b);
}
}
}
}
DA_DESTROY(&iv);
+
+#ifdef DEBUG
+ mpreduce_dump(r, stdout);
+#endif
return (0);
}
/* --- @mpreduce_exp@ --- *
*
* Arguments: @mpreduce *mr@ = pointer to reduction context
- * @mp *d@ = fake destination
- * @mp *a@ = base
- * @mp *e@ = exponent
+ * @mp *d@ = fake destination
+ * @mp *a@ = base
+ * @mp *e@ = exponent
*
- * Returns: Result, %$a^e \bmod m$%.
+ * Returns: Result, %$a^e \bmod m$%.
*/
mp *mpreduce_exp(mpreduce *mr, mp *d, mp *a, mp *e)