mirror of
https://github.com/arnaucube/ark-curves-cherry-picked.git
synced 2026-01-08 23:11:29 +01:00
Catch up with algebra (#106)
Co-authored-by: Pratyush Mishra <pratyushmishra@berkeley.edu>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
use ark_ec::{bls12::Bls12Parameters, ModelParameters};
|
||||
use ark_ec::{bls12::Bls12Parameters, CurveConfig};
|
||||
use ark_r1cs_std::{
|
||||
fields::fp::FpVar,
|
||||
groups::{bls12, curves::twisted_edwards::AffineVar as TEAffineVar},
|
||||
@@ -14,7 +14,7 @@ pub type G2Var = bls12::G2Var<Parameters>;
|
||||
/// An element of G1 (in TE Affine form) in the BLS12-377 bilinear group.
|
||||
pub type G1TEAffineVar = TEAffineVar<
|
||||
<Parameters as Bls12Parameters>::G1Parameters,
|
||||
FpVar<<<Parameters as Bls12Parameters>::G1Parameters as ModelParameters>::BaseField>,
|
||||
FpVar<<<Parameters as Bls12Parameters>::G1Parameters as CurveConfig>::BaseField>,
|
||||
>;
|
||||
|
||||
/// Represents the cached precomputation that can be performed on a G1 element
|
||||
|
||||
@@ -1,21 +1,19 @@
|
||||
use ark_ec::models::{
|
||||
twisted_edwards_extended::{
|
||||
GroupAffine as TEGroupAffine, GroupProjective as TEGroupProjective,
|
||||
short_weierstrass::{Affine as SWAffine, SWCurveConfig},
|
||||
twisted_edwards::{
|
||||
Affine as TEAffine, MontCurveConfig, Projective as TEProjective, TECurveConfig,
|
||||
},
|
||||
ModelParameters, MontgomeryModelParameters, SWModelParameters, TEModelParameters,
|
||||
CurveConfig,
|
||||
};
|
||||
use ark_ff::{MontFp, Zero};
|
||||
use ark_ff::{Field, MontFp, Zero};
|
||||
use core::ops::Neg;
|
||||
|
||||
use crate::{
|
||||
fields::{FQ_ONE, FQ_ZERO},
|
||||
Fq, Fr,
|
||||
};
|
||||
use crate::{Fq, Fr};
|
||||
|
||||
#[derive(Clone, Default, PartialEq, Eq)]
|
||||
pub struct Parameters;
|
||||
|
||||
impl ModelParameters for Parameters {
|
||||
impl CurveConfig for Parameters {
|
||||
type BaseField = Fq;
|
||||
type ScalarField = Fr;
|
||||
|
||||
@@ -24,22 +22,18 @@ impl ModelParameters for Parameters {
|
||||
|
||||
/// COFACTOR_INV = COFACTOR^{-1} mod r
|
||||
/// = 5285428838741532253824584287042945485047145357130994810877
|
||||
const COFACTOR_INV: Fr = MontFp!(
|
||||
Fr,
|
||||
"5285428838741532253824584287042945485047145357130994810877"
|
||||
);
|
||||
const COFACTOR_INV: Fr = MontFp!("5285428838741532253824584287042945485047145357130994810877");
|
||||
}
|
||||
|
||||
impl SWModelParameters for Parameters {
|
||||
impl SWCurveConfig for Parameters {
|
||||
/// COEFF_A = 0
|
||||
const COEFF_A: Fq = FQ_ZERO;
|
||||
const COEFF_A: Fq = Fq::ZERO;
|
||||
|
||||
/// COEFF_B = 1
|
||||
const COEFF_B: Fq = FQ_ONE;
|
||||
const COEFF_B: Fq = Fq::ONE;
|
||||
|
||||
/// AFFINE_GENERATOR_COEFFS = (G1_GENERATOR_X, G1_GENERATOR_Y)
|
||||
const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) =
|
||||
(G1_GENERATOR_X, G1_GENERATOR_Y);
|
||||
const GENERATOR: G1SWAffine = G1SWAffine::new_unchecked(G1_GENERATOR_X, G1_GENERATOR_Y);
|
||||
|
||||
#[inline(always)]
|
||||
fn mul_by_a(_: &Self::BaseField) -> Self::BaseField {
|
||||
@@ -47,8 +41,9 @@ impl SWModelParameters for Parameters {
|
||||
}
|
||||
}
|
||||
|
||||
pub type G1TEAffine = TEGroupAffine<Parameters>;
|
||||
pub type G1TEProjective = TEGroupProjective<Parameters>;
|
||||
pub type G1SWAffine = SWAffine<Parameters>;
|
||||
pub type G1TEAffine = TEAffine<Parameters>;
|
||||
pub type G1TEProjective = TEProjective<Parameters>;
|
||||
|
||||
/// Bls12_377::G1 also has a twisted Edwards form.
|
||||
/// It can be obtained via the following script, implementing
|
||||
@@ -97,18 +92,17 @@ pub type G1TEProjective = TEGroupProjective<Parameters>;
|
||||
/// # b = -TE1d/TE1a
|
||||
/// TE2d = Fp(122268283598675559488486339158635529096981886914877139579534153582033676785385790730042363341236035746924960903179)
|
||||
/// ```
|
||||
impl TEModelParameters for Parameters {
|
||||
impl TECurveConfig for Parameters {
|
||||
/// COEFF_A = -1
|
||||
const COEFF_A: Fq = MontFp!(Fq, "-1");
|
||||
const COEFF_A: Fq = MontFp!("-1");
|
||||
|
||||
/// COEFF_D = 122268283598675559488486339158635529096981886914877139579534153582033676785385790730042363341236035746924960903179 mod q
|
||||
const COEFF_D: Fq = MontFp!(Fq, "122268283598675559488486339158635529096981886914877139579534153582033676785385790730042363341236035746924960903179");
|
||||
const COEFF_D: Fq = MontFp!("122268283598675559488486339158635529096981886914877139579534153582033676785385790730042363341236035746924960903179");
|
||||
|
||||
/// AFFINE_GENERATOR_COEFFS = (GENERATOR_X, GENERATOR_Y)
|
||||
const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) =
|
||||
(TE_GENERATOR_X, TE_GENERATOR_Y);
|
||||
const GENERATOR: G1TEAffine = G1TEAffine::new_unchecked(TE_GENERATOR_X, TE_GENERATOR_Y);
|
||||
|
||||
type MontgomeryModelParameters = Parameters;
|
||||
type MontCurveConfig = Parameters;
|
||||
|
||||
/// Multiplication by `a` is multiply by `-1`.
|
||||
#[inline(always)]
|
||||
@@ -146,23 +140,23 @@ impl TEModelParameters for Parameters {
|
||||
// # MB = s
|
||||
// MB=Fp(10189023633222963290707194929886294091415157242906428298294512798502806398782149227503530278436336312243746741931)
|
||||
// ```
|
||||
impl MontgomeryModelParameters for Parameters {
|
||||
impl MontCurveConfig for Parameters {
|
||||
/// COEFF_A = 228097355113300204138531148905234651262148041026195375645000724271212049151994375092458297304264351187709081232384
|
||||
const COEFF_A: Fq = MontFp!(Fq, "228097355113300204138531148905234651262148041026195375645000724271212049151994375092458297304264351187709081232384");
|
||||
const COEFF_A: Fq = MontFp!("228097355113300204138531148905234651262148041026195375645000724271212049151994375092458297304264351187709081232384");
|
||||
|
||||
/// COEFF_B = 10189023633222963290707194929886294091415157242906428298294512798502806398782149227503530278436336312243746741931
|
||||
const COEFF_B: Fq = MontFp!(Fq, "10189023633222963290707194929886294091415157242906428298294512798502806398782149227503530278436336312243746741931");
|
||||
const COEFF_B: Fq = MontFp!("10189023633222963290707194929886294091415157242906428298294512798502806398782149227503530278436336312243746741931");
|
||||
|
||||
type TEModelParameters = Parameters;
|
||||
type TECurveConfig = Parameters;
|
||||
}
|
||||
|
||||
/// G1_GENERATOR_X =
|
||||
/// 81937999373150964239938255573465948239988671502647976594219695644855304257327692006745978603320413799295628339695
|
||||
pub const G1_GENERATOR_X: Fq = MontFp!(Fq, "81937999373150964239938255573465948239988671502647976594219695644855304257327692006745978603320413799295628339695");
|
||||
pub const G1_GENERATOR_X: Fq = MontFp!("81937999373150964239938255573465948239988671502647976594219695644855304257327692006745978603320413799295628339695");
|
||||
|
||||
/// G1_GENERATOR_Y =
|
||||
/// 241266749859715473739788878240585681733927191168601896383759122102112907357779751001206799952863815012735208165030
|
||||
pub const G1_GENERATOR_Y: Fq = MontFp!(Fq, "241266749859715473739788878240585681733927191168601896383759122102112907357779751001206799952863815012735208165030");
|
||||
pub const G1_GENERATOR_Y: Fq = MontFp!("241266749859715473739788878240585681733927191168601896383759122102112907357779751001206799952863815012735208165030");
|
||||
|
||||
// The generator for twisted Edward form is the same SW generator converted into
|
||||
// the normalized TE form (TE2).
|
||||
@@ -210,8 +204,8 @@ pub const G1_GENERATOR_Y: Fq = MontFp!(Fq, "241266749859715473739788878240585681
|
||||
// ```
|
||||
/// TE_GENERATOR_X =
|
||||
/// 71222569531709137229370268896323705690285216175189308202338047559628438110820800641278662592954630774340654489393
|
||||
pub const TE_GENERATOR_X: Fq = MontFp!(Fq, "71222569531709137229370268896323705690285216175189308202338047559628438110820800641278662592954630774340654489393");
|
||||
pub const TE_GENERATOR_X: Fq = MontFp!("71222569531709137229370268896323705690285216175189308202338047559628438110820800641278662592954630774340654489393");
|
||||
|
||||
/// TE_GENERATOR_Y =
|
||||
/// 6177051365529633638563236407038680211609544222665285371549726196884440490905471891908272386851767077598415378235
|
||||
pub const TE_GENERATOR_Y: Fq = MontFp!(Fq, "6177051365529633638563236407038680211609544222665285371549726196884440490905471891908272386851767077598415378235");
|
||||
pub const TE_GENERATOR_Y: Fq = MontFp!("6177051365529633638563236407038680211609544222665285371549726196884440490905471891908272386851767077598415378235");
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
use ark_ec::models::{ModelParameters, SWModelParameters};
|
||||
use ark_ff::{MontFp, QuadExt, Zero};
|
||||
use ark_ec::{
|
||||
models::{short_weierstrass::SWCurveConfig, CurveConfig},
|
||||
short_weierstrass::Affine,
|
||||
};
|
||||
use ark_ff::{Field, MontFp, Zero};
|
||||
|
||||
use crate::{fields::FQ_ZERO, g1, Fq, Fq2, Fr};
|
||||
use crate::{g1, Fq, Fq2, Fr};
|
||||
|
||||
pub type G2Affine = Affine<Parameters>;
|
||||
#[derive(Clone, Default, PartialEq, Eq)]
|
||||
pub struct Parameters;
|
||||
|
||||
impl ModelParameters for Parameters {
|
||||
impl CurveConfig for Parameters {
|
||||
type BaseField = Fq2;
|
||||
type ScalarField = Fr;
|
||||
|
||||
@@ -26,15 +30,13 @@ impl ModelParameters for Parameters {
|
||||
|
||||
/// COFACTOR_INV = COFACTOR^{-1} mod r
|
||||
/// = 6764900296503390671038341982857278410319949526107311149686707033187604810669
|
||||
const COFACTOR_INV: Fr = MontFp!(
|
||||
Fr,
|
||||
"6764900296503390671038341982857278410319949526107311149686707033187604810669"
|
||||
);
|
||||
const COFACTOR_INV: Fr =
|
||||
MontFp!("6764900296503390671038341982857278410319949526107311149686707033187604810669");
|
||||
}
|
||||
|
||||
impl SWModelParameters for Parameters {
|
||||
impl SWCurveConfig for Parameters {
|
||||
/// COEFF_A = [0, 0]
|
||||
const COEFF_A: Fq2 = QuadExt!(g1::Parameters::COEFF_A, g1::Parameters::COEFF_A,);
|
||||
const COEFF_A: Fq2 = Fq2::new(g1::Parameters::COEFF_A, g1::Parameters::COEFF_A);
|
||||
|
||||
// As per https://eprint.iacr.org/2012/072.pdf,
|
||||
// this curve has b' = b/i, where b is the COEFF_B of G1, and x^6 -i is
|
||||
@@ -42,14 +44,13 @@ impl SWModelParameters for Parameters {
|
||||
// In our case, i = u (App A.3, T_6).
|
||||
/// COEFF_B = [0,
|
||||
/// 155198655607781456406391640216936120121836107652948796323930557600032281009004493664981332883744016074664192874906]
|
||||
const COEFF_B: Fq2 = QuadExt!(
|
||||
FQ_ZERO,
|
||||
MontFp!(Fq, "155198655607781456406391640216936120121836107652948796323930557600032281009004493664981332883744016074664192874906"),
|
||||
const COEFF_B: Fq2 = Fq2::new(
|
||||
Fq::ZERO,
|
||||
MontFp!("155198655607781456406391640216936120121836107652948796323930557600032281009004493664981332883744016074664192874906"),
|
||||
);
|
||||
|
||||
/// AFFINE_GENERATOR_COEFFS = (G2_GENERATOR_X, G2_GENERATOR_Y)
|
||||
const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) =
|
||||
(G2_GENERATOR_X, G2_GENERATOR_Y);
|
||||
const GENERATOR: G2Affine = G2Affine::new_unchecked(G2_GENERATOR_X, G2_GENERATOR_Y);
|
||||
|
||||
#[inline(always)]
|
||||
fn mul_by_a(_: &Self::BaseField) -> Self::BaseField {
|
||||
@@ -57,21 +58,21 @@ impl SWModelParameters for Parameters {
|
||||
}
|
||||
}
|
||||
|
||||
pub const G2_GENERATOR_X: Fq2 = QuadExt!(G2_GENERATOR_X_C0, G2_GENERATOR_X_C1);
|
||||
pub const G2_GENERATOR_Y: Fq2 = QuadExt!(G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1);
|
||||
pub const G2_GENERATOR_X: Fq2 = Fq2::new(G2_GENERATOR_X_C0, G2_GENERATOR_X_C1);
|
||||
pub const G2_GENERATOR_Y: Fq2 = Fq2::new(G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1);
|
||||
|
||||
/// G2_GENERATOR_X_C0 =
|
||||
/// 233578398248691099356572568220835526895379068987715365179118596935057653620464273615301663571204657964920925606294
|
||||
pub const G2_GENERATOR_X_C0: Fq = MontFp!(Fq, "233578398248691099356572568220835526895379068987715365179118596935057653620464273615301663571204657964920925606294");
|
||||
pub const G2_GENERATOR_X_C0: Fq = MontFp!("233578398248691099356572568220835526895379068987715365179118596935057653620464273615301663571204657964920925606294");
|
||||
|
||||
/// G2_GENERATOR_X_C1 =
|
||||
/// 140913150380207355837477652521042157274541796891053068589147167627541651775299824604154852141315666357241556069118
|
||||
pub const G2_GENERATOR_X_C1: Fq = MontFp!(Fq, "140913150380207355837477652521042157274541796891053068589147167627541651775299824604154852141315666357241556069118");
|
||||
pub const G2_GENERATOR_X_C1: Fq = MontFp!("140913150380207355837477652521042157274541796891053068589147167627541651775299824604154852141315666357241556069118");
|
||||
|
||||
/// G2_GENERATOR_Y_C0 =
|
||||
/// 63160294768292073209381361943935198908131692476676907196754037919244929611450776219210369229519898517858833747423
|
||||
pub const G2_GENERATOR_Y_C0: Fq = MontFp!(Fq, "63160294768292073209381361943935198908131692476676907196754037919244929611450776219210369229519898517858833747423");
|
||||
pub const G2_GENERATOR_Y_C0: Fq = MontFp!("63160294768292073209381361943935198908131692476676907196754037919244929611450776219210369229519898517858833747423");
|
||||
|
||||
/// G2_GENERATOR_Y_C1 =
|
||||
/// 149157405641012693445398062341192467754805999074082136895788947234480009303640899064710353187729182149407503257491
|
||||
pub const G2_GENERATOR_Y_C1: Fq = MontFp!(Fq, "149157405641012693445398062341192467754805999074082136895788947234480009303640899064710353187729182149407503257491");
|
||||
pub const G2_GENERATOR_Y_C1: Fq = MontFp!("149157405641012693445398062341192467754805999074082136895788947234480009303640899064710353187729182149407503257491");
|
||||
|
||||
@@ -1,22 +1,19 @@
|
||||
use ark_algebra_test_templates::{
|
||||
curves::{curve_tests, edwards_tests, sw_tests},
|
||||
generate_bilinearity_test, generate_g1_generator_raw_test, generate_g1_test, generate_g2_test,
|
||||
groups::group_test,
|
||||
msm::test_var_base_msm,
|
||||
};
|
||||
use ark_ec::{models::SWModelParameters, AffineCurve, PairingEngine};
|
||||
use ark_ec::{models::short_weierstrass::SWCurveConfig, AffineCurve, PairingEngine};
|
||||
use ark_ff::{
|
||||
fields::{Field, PrimeField, SquareRootField},
|
||||
fields::{Field, PrimeField},
|
||||
One, Zero,
|
||||
};
|
||||
use ark_std::{rand::Rng, test_rng};
|
||||
use core::ops::{AddAssign, MulAssign};
|
||||
|
||||
use crate::{
|
||||
g1, g2, Bls12_377, Fq, Fq12, Fr, G1Affine, G1Projective, G1TEProjective, G2Affine, G2Projective,
|
||||
};
|
||||
use crate::{g1, g2, Bls12_377, Fq, Fq12, Fr, G1Affine, G1Projective, G2Affine, G2Projective};
|
||||
|
||||
generate_g1_test!(bls12_377; curve_tests; sw_tests; edwards_tests; te_group_tests;);
|
||||
generate_g1_test!(bls12_377; curve_tests; sw_tests; edwards_tests;);
|
||||
generate_g2_test!(bls12_377; curve_tests; sw_tests;);
|
||||
generate_bilinearity_test!(Bls12_377, Fq12);
|
||||
generate_g1_generator_raw_test!(bls12_377, 1);
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
use ark_ff::fields::{Fp384, MontBackend, MontConfig, MontFp};
|
||||
use ark_ff::fields::{Fp384, MontBackend, MontConfig};
|
||||
|
||||
#[derive(MontConfig)]
|
||||
#[modulus = "258664426012969094010652733694893533536393512754914660539884262666720468348340822774968888139573360124440321458177"]
|
||||
#[generator = "15"]
|
||||
pub struct FqConfig;
|
||||
pub type Fq = Fp384<MontBackend<FqConfig, 6>>;
|
||||
|
||||
pub const FQ_ONE: Fq = Fq::new(FqConfig::R);
|
||||
pub const FQ_ZERO: Fq = MontFp!(Fq, "0");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use ark_ff::{fields::*, CubicExt, MontFp, QuadExt};
|
||||
use ark_ff::{fields::*, MontFp};
|
||||
|
||||
use crate::*;
|
||||
|
||||
@@ -10,65 +10,65 @@ pub struct Fq12Config;
|
||||
impl Fp12Config for Fq12Config {
|
||||
type Fp6Config = Fq6Config;
|
||||
|
||||
const NONRESIDUE: Fq6 = CubicExt!(FQ2_ZERO, FQ2_ONE, FQ2_ZERO);
|
||||
const NONRESIDUE: Fq6 = Fq6::new(Fq2::ZERO, Fq2::ONE, Fq2::ZERO);
|
||||
|
||||
const FROBENIUS_COEFF_FP12_C1: &'static [Fq2] = &[
|
||||
// Fp2::NONRESIDUE^(((q^0) - 1) / 6)
|
||||
QuadExt!(FQ_ONE, FQ_ZERO),
|
||||
Fq2::new(Fq::ONE, Fq::ZERO),
|
||||
// Fp2::NONRESIDUE^(((q^1) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "92949345220277864758624960506473182677953048909283248980960104381795901929519566951595905490535835115111760994353"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("92949345220277864758624960506473182677953048909283248980960104381795901929519566951595905490535835115111760994353"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^2) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410946"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410946"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^3) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "216465761340224619389371505802605247630151569547285782856803747159100223055385581585702401816380679166954762214499"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("216465761340224619389371505802605247630151569547285782856803747159100223055385581585702401816380679166954762214499"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^4) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^5) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "123516416119946754630746545296132064952198520638002533875843642777304321125866014634106496325844844051843001220146"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("123516416119946754630746545296132064952198520638002533875843642777304321125866014634106496325844844051843001220146"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^6) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "-1"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("-1"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^7) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "165715080792691229252027773188420350858440463845631411558924158284924566418821255823372982649037525009328560463824"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("165715080792691229252027773188420350858440463845631411558924158284924566418821255823372982649037525009328560463824"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^8) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^9) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "42198664672744474621281227892288285906241943207628877683080515507620245292955241189266486323192680957485559243678"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("42198664672744474621281227892288285906241943207628877683080515507620245292955241189266486323192680957485559243678"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^10) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047232"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047232"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^11) - 1) / 6)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "135148009893022339379906188398761468584194992116912126664040619889416147222474808140862391813728516072597320238031"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("135148009893022339379906188398761468584194992116912126664040619889416147222474808140862391813728516072597320238031"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use ark_ff::{fields::*, MontFp, QuadExt};
|
||||
use ark_ff::{fields::*, MontFp};
|
||||
|
||||
use crate::*;
|
||||
|
||||
@@ -10,14 +10,14 @@ impl Fp2Config for Fq2Config {
|
||||
type Fp = Fq;
|
||||
|
||||
/// NONRESIDUE = -5
|
||||
const NONRESIDUE: Fq = MontFp!(Fq, "-5");
|
||||
const NONRESIDUE: Fq = MontFp!("-5");
|
||||
|
||||
/// Coefficients for the Frobenius automorphism.
|
||||
const FROBENIUS_COEFF_FP2_C1: &'static [Fq] = &[
|
||||
// NONRESIDUE**(((q^0) - 1) / 2)
|
||||
FQ_ONE,
|
||||
Fq::ONE,
|
||||
// NONRESIDUE**(((q^1) - 1) / 2)
|
||||
MontFp!(Fq, "-1"),
|
||||
MontFp!("-1"),
|
||||
];
|
||||
|
||||
#[inline(always)]
|
||||
@@ -28,6 +28,3 @@ impl Fp2Config for Fq2Config {
|
||||
fe - original
|
||||
}
|
||||
}
|
||||
|
||||
pub const FQ2_ZERO: Fq2 = QuadExt!(FQ_ZERO, FQ_ZERO);
|
||||
pub const FQ2_ONE: Fq2 = QuadExt!(FQ_ONE, FQ_ZERO);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use ark_ff::{fields::*, MontFp, QuadExt};
|
||||
use ark_ff::{fields::*, MontFp};
|
||||
|
||||
use crate::*;
|
||||
|
||||
@@ -11,59 +11,59 @@ impl Fp6Config for Fq6Config {
|
||||
type Fp2Config = Fq2Config;
|
||||
|
||||
/// NONRESIDUE = U
|
||||
const NONRESIDUE: Fq2 = QuadExt!(FQ_ZERO, FQ_ONE);
|
||||
const NONRESIDUE: Fq2 = Fq2::new(Fq::ZERO, Fq::ONE);
|
||||
|
||||
const FROBENIUS_COEFF_FP6_C1: &'static [Fq2] = &[
|
||||
// Fp2::NONRESIDUE^(((q^0) - 1) / 3)
|
||||
QuadExt!(FQ_ONE, FQ_ZERO),
|
||||
Fq2::new(Fq::ONE, Fq::ZERO),
|
||||
// Fp2::NONRESIDUE^(((q^1) - 1) / 3)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410946"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410946"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^2) - 1) / 3)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^3) - 1) / 3)
|
||||
QuadExt!(MontFp!(Fq, "-1"), FQ_ZERO),
|
||||
Fq2::new(MontFp!("-1"), Fq::ZERO),
|
||||
// Fp2::NONRESIDUE^(((q^4) - 1) / 3)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^(((q^5) - 1) / 3)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047232"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047232"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
];
|
||||
|
||||
const FROBENIUS_COEFF_FP6_C2: &'static [Fq2] = &[
|
||||
// Fp2::NONRESIDUE^((2*(q^0) - 2) / 3)
|
||||
QuadExt!(FQ_ONE, FQ_ZERO),
|
||||
Fq2::new(Fq::ONE, Fq::ZERO),
|
||||
// Fp2::NONRESIDUE^((2*(q^1) - 2) / 3)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
|
||||
FQ_ZERO
|
||||
Fq2::new(
|
||||
MontFp!("80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
|
||||
Fq::ZERO
|
||||
),
|
||||
// Fp2::NONRESIDUE^((2*(q^2) - 2) / 3)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^((2*(q^3) - 2) / 3)
|
||||
QuadExt!(FQ_ONE, FQ_ZERO),
|
||||
Fq2::new(Fq::ONE, Fq::ZERO),
|
||||
// Fp2::NONRESIDUE^((2*(q^4) - 2) / 3)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("80949648264912719408558363140637477264845294720710499478137287262712535938301461879813459410945"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
// Fp2::NONRESIDUE^((2*(q^5) - 2) / 3)
|
||||
QuadExt!(
|
||||
MontFp!(Fq, "258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
|
||||
FQ_ZERO,
|
||||
Fq2::new(
|
||||
MontFp!("258664426012969093929703085429980814127835149614277183275038967946009968870203535512256352201271898244626862047231"),
|
||||
Fq::ZERO,
|
||||
),
|
||||
];
|
||||
|
||||
@@ -72,6 +72,6 @@ impl Fp6Config for Fq6Config {
|
||||
// Karatsuba multiplication with constant other = u.
|
||||
let c0 = Fq2Config::mul_fp_by_nonresidue(&fe.c1);
|
||||
let c1 = fe.c0;
|
||||
QuadExt!(c0, c1)
|
||||
Fq2::new(c0, c1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ use ark_algebra_test_templates::{
|
||||
};
|
||||
use ark_ff::{
|
||||
biginteger::{BigInt, BigInteger, BigInteger384},
|
||||
fields::{FftField, Field, Fp6Config, PrimeField, SquareRootField},
|
||||
fields::{FftField, Field, Fp6Config, PrimeField},
|
||||
One, UniformRand, Zero,
|
||||
};
|
||||
use ark_serialize::{buffer_bit_byte_size, CanonicalSerialize};
|
||||
|
||||
Reference in New Issue
Block a user