public BIG(DBIG x) { for (int i = 0; i < NLEN; i++) { w[i] = x.w[i]; } }
/* Create random BIG in portable way, one bit at a time */ public static BIG RandomNum(BIG q, RAND rng) { DBIG d = new DBIG(0); int i, b, j = 0, r = 0; for (i = 0; i < 2 * q.NBits(); i++) { if (j == 0) { r = rng.Byte; } else { r >>= 1; } b = r & 1; d.Shl(1); d.w[0] += b; // m.inc(b); j++; j &= 7; } BIG m = d.Mod(q); return(m); }
/* return a^2 as DBIG */ /* Input must be normed */ public static DBIG Sqr(BIG a) { DBIG c = new DBIG(0); long carry; long[] cr = new long[2]; for (int i = 0; i < NLEN; i++) { carry = 0; for (int j = i + 1; j < NLEN; j++) { cr = MulAdd(2 * a.w[i], a.w[j], carry, c.w[i + j]); carry = cr[0]; c.w[i + j] = cr[1]; } c.w[NLEN + i] = carry; } for (int i = 0; i < NLEN; i++) { cr = MulAdd(a.w[i], a.w[i], 0, c.w[2 * i]); c.w[2 * i + 1] += cr[0]; c.w[2 * i] = cr[1]; } c.Norm(); return(c); }
public virtual void Copy(DBIG x) { for (int i = 0; i < NLEN; i++) { w[i] = x.w[i]; } }
/* return a^2 mod m */ public static BIG ModSqr(BIG a1, BIG m) { BIG a = new BIG(a1); a.Mod(m); DBIG d = Sqr(a); return(d.Mod(m)); }
/* return a*b mod m */ public static BIG ModMul(BIG a1, BIG b1, BIG m) { BIG a = new BIG(a1); BIG b = new BIG(b1); a.Mod(m); b.Mod(m); DBIG d = Mul(a, b); return(d.Mod(m)); }
/* return this*c and catch overflow in DBIG */ public virtual DBIG PXMul(int c) { DBIG m = new DBIG(0); long[] cr; long carry = 0; for (int j = 0; j < NLEN; j++) { cr = MulAdd(w[j], (long)c, carry, m.w[j]); carry = cr[0]; m.w[j] = cr[1]; } m.w[NLEN] = carry; return(m); }
internal static BIG Monty(BIG md, long MC, DBIG d) { BIG b; long m, carry; long[] cr = new long[2]; for (int i = 0; i < NLEN; i++) { if (MC == -1) { m = -d.w[i] & BMASK; } else { if (MC == 1) { m = d.w[i]; } else { m = (MC * d.w[i]) & BMASK; } } carry = 0; for (int j = 0; j < NLEN; j++) { cr = MulAdd(m, md.w[j], carry, d.w[i + j]); carry = cr[0]; d.w[i + j] = cr[1]; } d.w[NLEN + i] += carry; } b = new BIG(0); for (int i = 0; i < NLEN; i++) { b.w[i] = d.w[NLEN + i]; } b.Norm(); return(b); }
/* return a*b as DBIG */ /* Inputs must be normed */ public static DBIG Mul(BIG a, BIG b) { DBIG c = new DBIG(0); long carry; long[] cr = new long[2]; for (int i = 0; i < NLEN; i++) { carry = 0; for (int j = 0; j < NLEN; j++) { cr = MulAdd(a.w[i], b.w[j], carry, c.w[i + j]); carry = cr[0]; c.w[i + j] = cr[1]; } c.w[NLEN + i] = carry; } return(c); }