/* GLV method */ public static BIG[] glv(BIG e) { int i, j; BIG t = new BIG(0); BIG q = new BIG(ROM.CURVE_Order); BIG[] u = new BIG[2]; BIG[] v = new BIG[2]; for (i = 0; i < 2; i++) { t.copy(new BIG(ROM.CURVE_W[i])); // why not just t=new BIG(ROM.CURVE_W[i]); DBIG d = BIG.mul(t, e); v[i] = new BIG(d.div(q)); u[i] = new BIG(0); } u[0].copy(e); for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) { t.copy(new BIG(ROM.CURVE_SB[j][i])); t.copy(BIG.modmul(v[j], t, q)); u[i].add(q); u[i].sub(t); u[i].mod(q); } } return(u); }
/* Galbraith & Scott Method */ public static BIG[] gs(BIG e) { int i, j; BIG t = new BIG(0); BIG q = new BIG(ROM.CURVE_Order); BIG[] u = new BIG[4]; BIG[] v = new BIG[4]; for (i = 0; i < 4; i++) { t.copy(new BIG(ROM.CURVE_WB[i])); DBIG d = BIG.mul(t, e); v[i] = new BIG(d.div(q)); u[i] = new BIG(0); } u[0].copy(e); for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { t.copy(new BIG(ROM.CURVE_BB[j][i])); t.copy(BIG.modmul(v[j], t, q)); u[i].add(q); u[i].sub(t); u[i].mod(q); } } return(u); }
/* this*=b mod Modulus */ public void mul(FP b) { long ea = BIG.EXCESS(x); long eb = BIG.EXCESS(b.x); if ((ea + 1) * (eb + 1) + 1 >= ROM.FEXCESS) { reduce(); } DBIG d = BIG.mul(x, b.x); x.copy(BIG.mod(d)); }
/* z=x*y, t is workspace */ private void karmul(int vp, FF x, int xp, FF y, int yp, FF t, int tp, int n) { int nd2; if (n == 1) { DBIG d = BIG.mul(x.v[xp], y.v[yp]); v[vp + 1] = d.Split(8 * ROM.MODBYTES); v[vp].copy(d); return; } nd2 = n / 2; radd(vp, x, xp, x, xp + nd2, nd2); //rnorm(vp,nd2); radd(vp + nd2, y, yp, y, yp + nd2, nd2); //rnorm(vp+nd2,nd2); t.karmul(tp, this, vp, this, vp + nd2, t, tp + n, nd2); karmul(vp, x, xp, y, yp, t, tp + n, nd2); karmul(vp + n, x, xp + nd2, y, yp + nd2, t, tp + n, nd2); t.rdec(tp, this, vp, n); t.rdec(tp, this, vp + n, n); rinc(vp + nd2, t, tp, n); rnorm(vp, 2 * n); }