arnaucube
arnaucube/ark-curves-cherry-pickedPublic Self-hosted repository
ark-curves-cherry-picked/mnt6_753/src/curves/g2.rs
mnt6_753/src/curves/g2.rsRaw
  1use ark_ec::{
  2    mnt6,
  3    mnt6::MNT6Parameters,
  4    models::{ModelParameters, SWModelParameters},
  5};
  6use ark_ff::{field_new};
  7
  8use crate::{g1, Fq, Fq3, Fr, FQ_ZERO};
  9
 10pub type G2Affine = mnt6::G2Affine<crate::Parameters>;
 11pub type G2Projective = mnt6::G2Projective<crate::Parameters>;
 12pub type G2Prepared = mnt6::G2Prepared<crate::Parameters>;
 13
 14#[derive(Clone, Default, PartialEq, Eq)]
 15pub struct Parameters;
 16
 17impl ModelParameters for Parameters {
 18    type BaseField = Fq3;
 19    type ScalarField = Fr;
 20}
 21
 22/// MUL_BY_A_C0 = NONRESIDUE * COEFF_A
 23///             = 11 * 11
 24///             = 121
 25#[rustfmt::skip]
 26pub const MUL_BY_A_C0: Fq = field_new!(Fq, "121");
 27
 28/// MUL_BY_A_C1 = NONRESIDUE * COEFF_A
 29///             = 11 * 11
 30///             = 121
 31#[rustfmt::skip]
 32pub const MUL_BY_A_C1: Fq = field_new!(Fq, "121");
 33
 34/// MUL_BY_A_C2 = COEFF_A
 35pub const MUL_BY_A_C2: Fq = g1::Parameters::COEFF_A;
 36
 37impl SWModelParameters for Parameters {
 38    const COEFF_A: Fq3 = crate::Parameters::TWIST_COEFF_A;
 39    // B coefficient of MNT6-753 G2 =
 40    // ```
 41    // mnt6753_twist_coeff_b = mnt6753_Fq3(mnt6753_G1::coeff_b * mnt6753_Fq3::non_residue,
 42    //                                  mnt6753_Fq::zero(), mnt6753_Fq::zero());
 43    // non_residue = mnt6753_Fq3::non_residue = mnt6753_Fq("11");
 44    //  = (G1_B_COEFF * NON_RESIDUE, ZERO, ZERO);
 45    //  =
 46    //  (2189526091197672465268098090392210500740714959757583916377481826443393499947557697773546040576162515434508768057245887856591913752342600919117433675080691499697020523783784738694360040853591723916201150207746019687604267190251,
 47    //  0, 0)
 48    // ```
 49    #[rustfmt::skip]
 50    const COEFF_B: Fq3 = field_new!(
 51        Fq3,
 52        field_new!(Fq, "2189526091197672465268098090392210500740714959757583916377481826443393499947557697773546040576162515434508768057245887856591913752342600919117433675080691499697020523783784738694360040853591723916201150207746019687604267190251"),
 53        FQ_ZERO,
 54        FQ_ZERO,
 55    );
 56
 57    /// COFACTOR =
 58    /// 1755483545388786116744270475466687259186947712032004459714210070280389500116987496124098574823389466285978151140155508638765729019174599527183600372094760023144398285325863550664578643924584541949466179502227232245309952839189635010671372908411609248348904807785904229403747495114436660255866932060472369629692502198423138429922875792635236729929780298333055698257230963645509826963717287902205842627121011526048163097042046361575549171961352924692480000
 59    #[rustfmt::skip]
 60    const COFACTOR: &'static [u64] = &[
 61        17839255819456086016,
 62        500623104730997740,
 63        2110252009236161768,
 64        1500878543414750896,
 65        12839751506594314239,
 66        8978537329634833065,
 67        13830010955957826199,
 68        7626514311663165506,
 69        14876243211944528805,
 70        2316601947950921451,
 71        2601177562497904269,
 72        18300670698693155036,
 73        17321427554953155530,
 74        12586270719596716948,
 75        807965545138267130,
 76        13086323046094411844,
 77        16597411233431396880,
 78        5578519820383338987,
 79        16478065054289650824,
 80        12110148809888520863,
 81        5901144846689643164,
 82        3407195776166256068,
 83        14663852814447346059,
 84        13435169368,
 85    ];
 86
 87    /// COFACTOR^(-1) mod r =
 88    /// 6983081827986492233724035798540106188028451653325658178630583820170892135428517795509815627298389820236345161981341515817589065927929152555581161598204976128690232061758269440757592419606754539638220064054062394397574161203200
 89    #[rustfmt::skip]
 90    const COFACTOR_INV: Fr = field_new!(Fr, "6983081827986492233724035798540106188028451653325658178630583820170892135428517795509815627298389820236345161981341515817589065927929152555581161598204976128690232061758269440757592419606754539638220064054062394397574161203200");
 91
 92    /// AFFINE_GENERATOR_COEFFS = (G2_GENERATOR_X, G2_GENERATOR_Y)
 93    const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) =
 94        (G2_GENERATOR_X, G2_GENERATOR_Y);
 95
 96    #[inline(always)]
 97    fn mul_by_a(elt: &Fq3) -> Fq3 {
 98        field_new!(
 99            Fq3,
100            MUL_BY_A_C0 * &elt.c1,
101            MUL_BY_A_C1 * &elt.c2,
102            MUL_BY_A_C2 * &elt.c0,
103        )
104    }
105}
106
107const G2_GENERATOR_X: Fq3 =
108    field_new!(Fq3, G2_GENERATOR_X_C0, G2_GENERATOR_X_C1, G2_GENERATOR_X_C2);
109const G2_GENERATOR_Y: Fq3 =
110    field_new!(Fq3, G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1, G2_GENERATOR_Y_C2);
111
112// Generator of G2
113// These are three Fq elements each because X and Y (and Z) are elements of Fq^3
114// X = 27250797394340459586637772414334383652934225310678303542554641987990991970766156209996739240400887081904395745019996048910447071686918567661896491214767494514394154061111870331668445455228882471000120574964265209669155206168252,
115// 35762481056967998715733586393399457882827322353696313323665483142561285210083843314423554450886956650265947502285422529615273790981238406393402603210224104850580302463396274854098657541573494421834514772635884262388058080180368,
116// 36955296703808958167583270646821654948157955258947892285629161090141878438357164213613114995903637211606408001037026832604054121847388692538440756596264746452765613740820430501353237866984394057660379098674983614861254438847846,
117// Y = 2540920530670785421282147216459500299597350984927286541981768941513322907384197363939300669100157141915897390694710534916701460991329498878429407641200901974650893207493883271892985923686300670742888673128384350189165542294615,
118// 7768974215205248225654340523113146529854477025417883273460270519532499370133542215655437897583245920162220909271982265882784840026754554720358946490360213245668334549692889019612343620295335698052097726325099648573158597797497,
119// 21014872727619291834131369222699267167761185012487859171850226473555446863681002782100371394603357586906967186931035615146288030444598977758226767063525819170917389755555854704165900869058188909090444447822088242504281789869689,
120pub const G2_GENERATOR_X_C0: Fq = field_new!(Fq, "27250797394340459586637772414334383652934225310678303542554641987990991970766156209996739240400887081904395745019996048910447071686918567661896491214767494514394154061111870331668445455228882471000120574964265209669155206168252");
121pub const G2_GENERATOR_X_C1: Fq = field_new!(Fq, "35762481056967998715733586393399457882827322353696313323665483142561285210083843314423554450886956650265947502285422529615273790981238406393402603210224104850580302463396274854098657541573494421834514772635884262388058080180368");
122pub const G2_GENERATOR_X_C2: Fq = field_new!(Fq, "36955296703808958167583270646821654948157955258947892285629161090141878438357164213613114995903637211606408001037026832604054121847388692538440756596264746452765613740820430501353237866984394057660379098674983614861254438847846");
123
124pub const G2_GENERATOR_Y_C0: Fq = field_new!(Fq, "2540920530670785421282147216459500299597350984927286541981768941513322907384197363939300669100157141915897390694710534916701460991329498878429407641200901974650893207493883271892985923686300670742888673128384350189165542294615");
125pub const G2_GENERATOR_Y_C1: Fq = field_new!(Fq, "7768974215205248225654340523113146529854477025417883273460270519532499370133542215655437897583245920162220909271982265882784840026754554720358946490360213245668334549692889019612343620295335698052097726325099648573158597797497");
126pub const G2_GENERATOR_Y_C2: Fq = field_new!(Fq, "21014872727619291834131369222699267167761185012487859171850226473555446863681002782100371394603357586906967186931035615146288030444598977758226767063525819170917389755555854704165900869058188909090444447822088242504281789869689");