public static void secp256k1_ge_set_all_gej_var(Ge[] r, GeJ[] a, int len, EventHandler <Callback> cb) { var a1 = new Fe[len]; var len1 = 0; for (var index = 0; index < len; ++index) { if (!a[index].Infinity) { a1[len1++] = a[index].Z.Clone(); } } var r1 = new Fe[len1]; Field.InvAllVar(r1, a1, len1); var num = 0; for (var index = 0; index < len; ++index) { r[index].Infinity = a[index].Infinity; if (!a[index].Infinity) { Group.secp256k1_ge_set_gej_zinv(r[index], a[index], r1[num++]); } } }
public static void secp256k1_ge_set_table_gej_var(Ge[] r, GeJ[] a, Fe[] zr, int len) { var index = len - 1; var fe = new Fe(); if (len <= 0) { return; } Field.Inv(fe, a[index].Z); Group.secp256k1_ge_set_gej_zinv(r[index], a[index], fe); while (index > 0) { Field.Mul(fe, fe, zr[index]); --index; Group.secp256k1_ge_set_gej_zinv(r[index], a[index], fe); } }
private static void secp256k1_ecmult_odd_multiples_table(int n, GeJ[] prej, Fe[] zr, GeJ a) { var r1 = new GeJ(); Group.secp256k1_gej_double_var(r1, a, (Fe)null); var b = new Ge(); b.X = r1.X.Clone(); b.Y = r1.Y.Clone(); b.Infinity = false; var r2 = new Ge(); Group.secp256k1_ge_set_gej_zinv(r2, a, r1.Z); prej[0].X = r2.X.Clone(); prej[0].Y = r2.Y.Clone(); prej[0].Z = a.Z.Clone(); prej[0].Infinity = false; zr[0] = r1.Z.Clone(); for (var index = 1; index < n; ++index) { Group.secp256k1_gej_add_ge_var(prej[index], prej[index - 1], b, zr[index]); } Field.Mul(prej[n - 1].Z, prej[n - 1].Z, r1.Z); }