use crypto_bigint::Word;
pub trait BNParam {
const U: &'static [Word]; const LIMBS: usize; const MODULUS: &'static [Word]; const NEG_INV_MOD: &'static [Word]; const MONTY_P: &'static [Word]; const ORDER: &'static [Word]; const NEG_INV_ORD: &'static [Word]; const MONTY_N: &'static [Word]; const SQRT_NEG_3: &'static [Word]; const SVDW: &'static [Word]; const ZETA: &'static [Word]; const THETA: &'static [Word]; const OMEGA: &'static [Word]; const TRIPLES: Word; const CURVE_B: Word = 2; const FIELD_XI_RE: Word = 1; const FIELD_XI_IM: Word = 1;
}
pub struct BN062Param;
impl BNParam for BN062Param {
const U: &'static [Word] = &[ 0x0000000000004369,
];
const LIMBS: usize = 1;
const MODULUS: &'static [Word] = &[ 0x2C4E3CD0D14F0AC3,
];
const NEG_INV_MOD: &'static [Word] = &[ 0xDB8AD7BBB2FD8A15,
];
const MONTY_P: &'static [Word] = &[ 0xDE55803DB05C038,
];
const ORDER: &'static [Word] = &[ 0x2C4E3CD066CE445D,
];
const NEG_INV_ORD: &'static [Word] = &[ 0x88FDF683C27E500B,
];
const MONTY_N: &'static [Word] = &[ 0x1C24D8F4049D30AB,
];
const SQRT_NEG_3: &'static [Word] = &[ 0x2C4D948EFFDA88C4,
];
const SVDW: &'static [Word] = &[ 0x2C4DE8AFE894C9C3,
];
const ZETA: &'static [Word] = &[ 0x00005420E8BA40FF,
];
const THETA: &'static [Word] = &[ 0x0706C7478E24B945,
];
const OMEGA: &'static [Word] = &[ 0x0000000000019474,
];
const TRIPLES: Word = 25; }
pub struct BN126Param;
impl BNParam for BN126Param {
const U: &'static [Word] = &[ 0x0000000044820001, 0x0000000000000000,
];
const LIMBS: usize = 2;
const MODULUS: &'static [Word] = &[ 0x3F5E4A24DF9C0013, 0x2F43EEE6B3695A66,
];
const NEG_INV_MOD: &'static [Word] = &[ 0xB9FEE1E4AAD035E5, 0xD8FE23566120ACCF,
];
const MONTY_P: &'static [Word] = &[ 0x8FDF6EF1F4090A17, 0x1635B2CFD9DA7EF5,
];
const ORDER: &'static [Word] = &[ 0xD15E5E09A984000D, 0x2F43EEE6B3695A65,
];
const NEG_INV_ORD: &'static [Word] = &[ 0xB1EC226696F7B13B, 0x2E4855D55B551732,
];
const MONTY_N: &'static [Word] = &[ 0xC01B926C09B7EBC0, 0x2613C51AE72E5B19,
];
const SQRT_NEG_3: &'static [Word] = &[ 0x7E3F38F66C300004, 0x2F43EEE602CA5257,
];
const SVDW: &'static [Word] = &[ 0xDECEC18DA5E6000B, 0x2F43EEE65B19D65E,
];
const ZETA: &'static [Word] = &[ 0x608F889739B60007, 0x00000000584F8407,
];
const THETA: &'static [Word] = &[ 0xF9FF583D7CFD4106, 0x1823917A5121C688,
];
const OMEGA: &'static [Word] = &[ 0x000000019B0C0004, 0x0000000000000000,
];
const TRIPLES: Word = 42; }
pub struct BN190Param;
impl BNParam for BN190Param {
const U: &'static [Word] = &[ 0x0000402120000001, 0x0000000000000000, 0x0000000000000000,
];
const LIMBS: usize = 3;
const MODULUS: &'static [Word] = &[ 0x10138A17C0000013, 0xCDAA69E40E8C75C7, 0x244AC1F10FE053FA,
];
const NEG_INV_MOD: &'static [Word] = &[ 0x2B8614F2979435E5, 0xBE12481DDD063F8C, 0x453F3253D277C95C,
];
const MONTY_P: &'static [Word] = &[ 0xD0B5EB9319DF6C9, 0xE37D55E42AF76A15, 0x1D4ED66E1AFD74DB,
];
const ORDER: &'static [Word] = &[ 0x7810888A4000000D, 0xCDAA69E3AE28FC0F, 0x244AC1F10FE053FA,
];
const NEG_INV_ORD: &'static [Word] = &[ 0x1571B5117B13B13B, 0x444F031964A805C8, 0x5294CFA1CBB0835A,
];
const MONTY_N: &'static [Word] = &[ 0x30DC5A0E2C800770, 0x6ED951C9DD168E3D, 0xC7F382A8D97F45E,
];
const SQRT_NEG_3: &'static [Word] = &[ 0xF006031B00000004, 0xC1DC469647E2C12B, 0x244AC1F10FDFC31A,
];
const SVDW: &'static [Word] = &[ 0x800CC6996000000B, 0xC7C3583D2B379B79, 0x244AC1F10FE00B8A,
];
const ZETA: &'static [Word] = &[ 0x9006C37E60000007, 0x05E711A6E354DA4D, 0x0000000000004870,
];
const THETA: &'static [Word] = &[ 0x469AF4CD2D3FD6D0, 0xFFA410953DC37020, 0x0DC89DC343BB6E7C,
];
const OMEGA: &'static [Word] = &[ 0x000180C6C0000004, 0x0000000000000000, 0x0000000000000000,
];
const TRIPLES: Word = 58; }
pub struct BN254Param;
impl BNParam for BN254Param {
const U: &'static [Word] = &[ 0x4080000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const LIMBS: usize = 4;
const MODULUS: &'static [Word] = &[ 0xA700000000000013, 0x6121000000000013, 0xBA344D8000000008, 0x2523648240000001,
];
const NEG_INV_MOD: &'static [Word] = &[ 0x8435E50D79435E5, 0x6E371BA81104F6C8, 0x92022379C45B843C, 0xB65373CCBA60808C,
];
const MONTY_P: &'static [Word] = &[ 0xB3E886745370473D, 0x55EFBF6E8C1CC3F1, 0x281E3A1B7F86954F, 0x1B0A32FDF6403A3D,
];
const ORDER: &'static [Word] = &[ 0xA10000000000000D, 0xFF9F800000000010, 0xBA344D8000000007, 0x2523648240000001,
];
const NEG_INV_ORD: &'static [Word] = &[ 0xEA3B13B13B13B13B, 0x4B35EE94731FCF86, 0x42217FC31DF24016, 0xF3D5266BA9BBA566,
];
const MONTY_N: &'static [Word] = &[ 0xDF8596B6F40AA7A1, 0xE0885092E2231EC3, 0xC300765B575D5A78, 0x24E8B3BC325F9035,
];
const SQRT_NEG_3: &'static [Word] = &[ 0xC00000000000004, 0xCF0F000000000006, 0x26CD890000000003, 0x2523648240000001,
];
const SVDW: &'static [Word] = &[ 0xD98000000000000B, 0x181800000000000C, 0x7080EB4000000006, 0x2523648240000001,
];
const ZETA: &'static [Word] = &[ 0xCD80000000000007, 0x4909000000000006, 0x49B3624000000002, 0x0000000000000000,
];
const THETA: &'static [Word] = &[ 0x859975AB54B5EF9B, 0xCB1BAEA0B017046E, 0xC2B0D5792CD135AC, 0x19F3DB6884CDCA43,
];
const OMEGA: &'static [Word] = &[ 0x8300000000000004, 0x0000000000000001, 0x0000000000000000, 0x0000000000000000,
];
const TRIPLES: Word = 70; }
pub struct BN318Param;
impl BNParam for BN318Param {
const U: &'static [Word] = &[ 0x0000200000000401, 0x0000000000004080, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const LIMBS: usize = 5;
const MODULUS: &'static [Word] = &[ 0x8409E41B08413813, 0x50BF2B5D3A282988, 0x29EA7C35A71B37AA, 0x4010FE7C6D5CC82A, 0x2523648289B36240,
];
const NEG_INV_MOD: &'static [Word] = &[ 0x4938437C6AACADE5, 0x7B96E8C7B0EDE444, 0xEFBFE36641C45E10, 0xFDA833931631A6CD, 0x3E74ABE4BFC2A771,
];
const MONTY_P: &'static [Word] = &[ 0xCB414550A0290D0F, 0xE8F195C8F5302C3F, 0x7D96F275A3A6DC14, 0x42F53ACEFC6FFB9, 0x209EFE19B36785E2,
];
const ORDER: &'static [Word] = &[ 0x7E08641B07E1080D, 0xEFFF2B5D160D2388, 0x29EA7C354599B7A9, 0x4010FE7C6D5CC82A, 0x2523648289B36240,
];
const NEG_INV_ORD: &'static [Word] = &[ 0x279E97FF5969793B, 0x9295AA7F925FB477, 0x2CF855D07CC959EB, 0x1B6F57FB8A4A1678, 0x8676BC7505129C3D,
];
const MONTY_N: &'static [Word] = &[ 0x5CD5AAA94DD22D2E, 0xE9BF7FEF81350540, 0xC7DA00D20AEB8D1F, 0xFF5DC746D58374CF, 0x88138925E79C61,
];
const SQRT_NEG_3: &'static [Word] = &[ 0x3C03241203C06004, 0xC7BF22E828FA8DB0, 0xC9E9F3ECA9090A6F, 0x40106B15A8DBECC6, 0x2523648289B36240,
];
const SVDW: &'static [Word] = &[ 0x600684168600CC0B, 0xC3F2722B1915B9C, 0x79EA38112812210D, 0x4010B4C90B1C5A78, 0x2523648289B36240,
];
const ZETA: &'static [Word] = &[ 0x2403600482406C07, 0x4480043A8896CDEC, 0xB00044247F09169D, 0x000049B362406DB1, 0x0000000000000000,
];
const THETA: &'static [Word] = &[ 0xEC1404A33922B879, 0x39F4F8E17E5E5FFB, 0x0E575687CA4256D2, 0xF291D20FEB634EFC, 0x11DDD09B259C8A86,
];
const OMEGA: &'static [Word] = &[ 0x0000C00000001804, 0x0000000000018300, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const TRIPLES: Word = 90; }
pub struct BN382Param;
impl BNParam for BN382Param {
const U: &'static [Word] = &[ 0x0000000000000001, 0x0000000040001100, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const LIMBS: usize = 6;
const MODULUS: &'static [Word] = &[ 0x13, 0x1380052E00, 0x4004620095040000, 0x5B710818AC000008, 0xE42DE125B0015840, 0x240026400F3D82B2,
];
const NEG_INV_MOD: &'static [Word] = &[ 0x79435E50D79435E5, 0x8827B640AFDE30D, 0x861567FE0E908DD4, 0x9C7031B652D43848, 0xEF8597D0478E604F, 0x3582C27A42FDCD8D,
];
const MONTY_P: &'static [Word] = &[ 0x69AD4AB90DB04BC, 0xE80C0A3EDDDD6274, 0xC9E6B470CE70B141, 0x65605B2172BA3FCF, 0xB6995178418E89C9, 0x79948F5FBE4C744,
];
const ORDER: &'static [Word] = &[ 0xD, 0x1080046200, 0xE0042F008E3E0000, 0x5B710818AC000007, 0xE42DE125B0015840, 0x240026400F3D82B2,
];
const NEG_INV_ORD: &'static [Word] = &[ 0xB13B13B13B13B13B, 0xF25DEACC8B5CD13, 0x13B4EB1D200B9C06, 0xAA244F7AB280DFB9, 0xC08335F875845D22, 0x2D6C0021AD7A0A8D,
];
const MONTY_N: &'static [Word] = &[ 0x67BC961D1EDC52C8, 0x22A0C57E745163E3, 0x66220C6DAB643A11, 0x8D5F0EA4F5122BDF, 0x8434A18FE9D020BA, 0x22DC13812E451EC5,
];
const SQRT_NEG_3: &'static [Word] = &[ 0x4, 0x600019800, 0xC001FE0043BC0000, 0x3CF60565C8000003, 0xE42DE1252000E580, 0x240026400F3D82B2,
];
const SVDW: &'static [Word] = &[ 0xB, 0xCC0036300, 0x330006C600000, 0x4C3386BF3A000006, 0xE42DE12568011EE0, 0x240026400F3D82B2,
];
const ZETA: &'static [Word] = &[ 0x0000000000000007, 0x00000006C001CB00, 0x4001320028A40000, 0x0F3D815972000002, 0x0000000048003960, 0x0000000000000000,
];
const THETA: &'static [Word] = &[ 0x6603054DCCAEFAB3, 0x8A75CBF442F9193A, 0xAAB86C79C7FCC84E, 0xC34B845C57D62362, 0x0F15954A37B15704, 0x10F8BEE840937D43,
];
const OMEGA: &'static [Word] = &[ 0x0000000000000004, 0x0000000180006600, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const TRIPLES: Word = 104; }
pub struct BN446Param;
impl BNParam for BN446Param {
const U: &'static [Word] = &[ 0x0040000000000001, 0x0000400000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const LIMBS: usize = 7;
const MODULUS: &'static [Word] = &[ 0x1380000000000013, 0x421BC0000000004E, 0x5156523000000084, 0x245EAACD7400006C, 0x241B1B05A00024, 0xD86C28800, 0x2400000000024090,
];
const NEG_INV_MOD: &'static [Word] = &[ 0xC35E50D79435E5, 0xB0E9AA31A3CFC745, 0xEE2AE5CE18B53DD7, 0xD2CCA970525D198F, 0xF3C754B67F9BCEF6, 0x2D6E49FABA499912, 0xA4E6A39449100EAC,
];
const MONTY_P: &'static [Word] = &[ 0xE26FA0B04A7F400A, 0xEC8DF54C75504D52, 0x75E8ACEEAA6E88B0, 0xBAA7137AE1D5FA30, 0x4BAF0A759734FF4C, 0xF5CACE4BB4B43382, 0x1A05DC7494424D1,
];
const ORDER: &'static [Word] = &[ 0x108000000000000D, 0x3F18600000000042, 0x515351700000007E, 0x245EAACD1400006C, 0x241B1B05A00024, 0xD86C28800, 0x2400000000024090,
];
const NEG_INV_ORD: &'static [Word] = &[ 0xDBB13B13B13B13B, 0x2E1B6731FCF86D11, 0xC6BEC51B424D234D, 0x1B1CE0249787AD55, 0x3AC020B3CD8652EF, 0x452E55E3927E7DC3, 0xAC5B624521068C24,
];
const MONTY_N: &'static [Word] = &[ 0x34AF237294F155E6, 0xDAE61271CED1912A, 0x144EE8957078C4CA, 0xF32FE0F2D8A7A4C0, 0x82FEA7875F5AB6DF, 0x1024D7BA46D0F511, 0x180B87A71C2F0A2E,
];
const SQRT_NEG_3: &'static [Word] = &[ 0x600000000000004, 0x1E09C00000000018, 0x362B88A00000003C, 0x24439D4744000048, 0x241B1443F00024, 0xD86C1F800, 0x2400000000024090,
];
const SVDW: &'static [Word] = &[ 0xCC000000000000B, 0x3012C00000000033, 0x43C0ED6800000060, 0x2451240A5C00005A, 0x241B17A4C80024, 0xD86C24000, 0x2400000000024090,
];
const ZETA: &'static [Word] = &[ 0x06C0000000000007, 0x120900000000001B, 0x0D9564C800000024, 0x000D86C318000012, 0x0000000360D80000, 0x0000000000004800, 0x0000000000000000,
];
const THETA: &'static [Word] = &[ 0x41CFEADA080C2332, 0x948FAE675396864B, 0xDDC23888AB244E86, 0xF1D58DA5FF569B56, 0xBC534C389B8DD5B7, 0x36F095C0819CB8EE, 0x165C7B9BADE4D70D,
];
const OMEGA: &'static [Word] = &[ 0x0180000000000004, 0x0001800000000006, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const TRIPLES: Word = 120; }
pub struct BN510Param;
impl BNParam for BN510Param {
const U: &'static [Word] = &[ 0x0000000000200001, 0x4800400000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const LIMBS: usize = 8;
const MODULUS: &'static [Word] = &[ 0x2100009C00013, 0xF013800002400036, 0x40136C814D480855, 0x739A900840000014, 0x44587CB45BBC, 0xC811688DB201B000, 0x2400000000668513, 0x39AB0D091160A200,
];
const NEG_INV_MOD: &'static [Word] = &[ 0xABCC7C5D9B5435E5, 0x77EB05E52AF9A9, 0x92D19BCFEE819E18, 0x544B0ABCE11D817, 0xBAC7C6FC4B941639, 0xC73A63EC6417A437, 0xA2F81BB694813DF1, 0xDA575D9097C2877D,
];
const MONTY_P: &'static [Word] = &[ 0x8FF9B35B594AD2F3, 0x710489408C0D6947, 0x287A063966FDD1A6, 0x82D87D6178A931A4, 0x321DF12CA4FD4C77, 0xB61365671746C689, 0x2C1CBC4C3A55B66B, 0x18D67A6DED8E4F79,
];
const ORDER: &'static [Word] = &[ 0x1F8000840000D, 0x9010800002400036, 0x40136C814CDC07F2, 0xFA19B807E0000014, 0x44587CB45BBB, 0xC811688DB201B000, 0x2400000000668513, 0x39AB0D091160A200,
];
const NEG_INV_ORD: &'static [Word] = &[ 0x3B8AFDF6E953B13B, 0x338C339D72FEB6BB, 0x5D88679D267DEBB8, 0x95C618B4082A94C3, 0xEEFE4E4F27F7E469, 0xF4A088E31EF5FC32, 0xBFBF9DFD00D74CFF, 0x3E6EDA1B8DE99E1A,
];
const MONTY_N: &'static [Word] = &[ 0xC94822768CFA9D9D, 0x5F2DE31D0698BC9C, 0x44BB50FA3DAA939B, 0x43CCFB96A60BA213, 0x70B8F00B119C4D6B, 0xA6CA0FF8B71B95A0, 0x938E89290BD0AA19, 0x10AECFC0FEB827CD,
];
const SQRT_NEG_3: &'static [Word] = &[ 0xF00003000004, 0xC006000002400024, 0x4012F300DC3803C6, 0xC0B87003C0000014, 0x44587BA2F9D0, 0xFB0745CBCC012000, 0x2400000000668512, 0x39AB0D091160A200,
];
const SVDW: &'static [Word] = &[ 0x180000660000B, 0x580CC0000240002D, 0x40132FC114C0060E, 0x9A29800600000014, 0x44587C2BAAC6, 0x618C572CBF016800, 0x2400000000668513, 0x39AB0D091160A200,
];
const ZETA: &'static [Word] = &[ 0x0000900003600007, 0x9806C00000000009, 0x00003CC038880247, 0xD971100240000000, 0x000000000088B0F5, 0x66851160F3004800, 0x0000000000000000, 0x0000000000000000,
];
const THETA: &'static [Word] = &[ 0xB1806C932AED25F1, 0x96177604B97F4BBA, 0xCB6FB2BEDECAED02, 0xFC28603A9E5473CA, 0x5DE3141FBBB469CE, 0x07A57797B1F075FE, 0x17711CF6FAC6D962, 0x1DF877ADAA860EBF,
];
const OMEGA: &'static [Word] = &[ 0x0000000000C00004, 0xB001800000000000, 0x0000000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const TRIPLES: Word = 138; }
pub struct BN574Param;
impl BNParam for BN574Param {
const U: &'static [Word] = &[ 0x0000000000000001, 0x0000801000000000, 0x0000000000004800, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const LIMBS: usize = 9;
const MODULUS: &'static [Word] = &[ 0x13, 0x2704E000000000, 0x15F000, 0x24A4002108408400, 0xA206C00A71000025, 0x1016CDB25B2D8510, 0xC9229D1C8030D21A, 0x4691711B11E63CC4, 0x39AA40019A434204,
];
const NEG_INV_MOD: &'static [Word] = &[ 0x79435E50D79435E5, 0xD573B2B79435E50D, 0xAAE72E181C5DAADB, 0x2B196D77F0378DB7, 0xB003025784E029CD, 0x95FDEC62D039118B, 0xFAF0E2CFC7A406C4, 0xB02FBFC8CCBEEBCB, 0x3DD84BAAB5C50D6C,
];
const MONTY_P: &'static [Word] = &[ 0xEF7A4CB77C262E, 0xCA84F4386EF5CDC2, 0xE5B9AF37D3363D0E, 0x1D95096FF9D5EC2D, 0xE362428F3FEC2124, 0x7E94E7177C7BA6FC, 0xCEC8D4217B360C05, 0x4322F70A4A23AC8F, 0x30A6E5281DCAC056,
];
const ORDER: &'static [Word] = &[ 0xD, 0x21042000000000, 0x129000, 0x746E001F87E07E00, 0xA206C009F7800023, 0x1016CDB25B2D8510, 0xC9229D1C8030D21A, 0x4691711B11E63CC4, 0x39AA40019A434204,
];
const NEG_INV_ORD: &'static [Word] = &[ 0xB13B13B13B13B13B, 0x92EF885B13B13B13, 0x80C1E4BBD5961307, 0x7D6679A5F7D30833, 0xA1113301E20DCED3, 0x3A87F419033AA67B, 0x29A855E9B09A0CA4, 0xBC01C75C65A51C51, 0xD447C63E2658C17C,
];
const MONTY_N: &'static [Word] = &[ 0x5483A50B1551AB96, 0xA79C392FF6018DF5, 0x792401ABEE168A90, 0xE2D52709EEA3FF99, 0x6394C82B5B74B2F2, 0x369E81132EDA0CB4, 0xA03CD8E4B857AA6C, 0x86746B5DCECA32BA, 0x217A0C405265FB89,
];
const SQRT_NEG_3: &'static [Word] = &[ 0x4, 0xC018000000000, 0x6C000, 0xE21C000F03C03C00, 0x6C048004BF000010, 0x600F33CC3CC90360, 0xC921D014802C8C11, 0x4691711B11E63CC4, 0x39AA40019A434204,
];
const SVDW: &'static [Word] = &[ 0xB, 0x19833000000000, 0xE5800, 0x360001806006000, 0x8705A0079800001B, 0xB81300BF4BFB4438, 0xC9223698802EAF15, 0x4691711B11E63CC4, 0x39AA40019A434204,
];
const ZETA: &'static [Word] = &[ 0x0000000000000007, 0x000D81B000000000, 0x0000000000079800, 0x2144000902402400, 0x1B012002D900000A, 0x5803CCF30F3240D8, 0x0000668400022304, 0x0000000000000000, 0x0000000000000000,
];
const THETA: &'static [Word] = &[ 0x8F80C7AB3DBBE795, 0xEFB24257C99700DC, 0x0C69716FCC97A1F9, 0xE3071EA7449020C6, 0x198B85C58DF35671, 0xFC2E189441DFA649, 0xF707BEC1FD400FDE, 0x6F83DB54E46A196D, 0x163AA608C26C4C22,
];
const OMEGA: &'static [Word] = &[ 0x0000000000000004, 0x0003006000000000, 0x000000000001B000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const TRIPLES: Word = 154; }
pub struct BN638Param;
impl BNParam for BN638Param {
const U: &'static [Word] = &[ 0x0000000020000001, 0x0000000000000000, 0x0000000048100000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const LIMBS: usize = 10;
const MODULUS: &'static [Word] = &[ 0x10000009C0000013, 0x240000036000002, 0x4A100015F4E00000, 0x144480016CD10009, 0x75A4840000000000, 0x44766363358CA88A, 0xC000000000000000, 0x66C8673388B26B26, 0x0, 0x39DD931888240000,
];
const NEG_INV_MOD: &'static [Word] = &[ 0xAE016B14979435E5, 0x968821CD95843C76, 0xCD45612C9257ED74, 0x7E48BD1138EA2146, 0x90ABA2C4D34669C6, 0x15015D95B7C01DC9, 0xEE610D29FF571C5A, 0x22EEE76581894B1C, 0x58F54B50E055CE9F, 0x16B9809208400D9C,
];
const MONTY_P: &'static [Word] = &[ 0x81604B883BF65D0E, 0xFA354A78F3191E15, 0xFA2E0C8C1347BA4D, 0x663BD79A447C6F3F, 0xD4A87450A9DFC703, 0x1ED5644D5C089835, 0x5C7E534E700E9ADB, 0x679ED767BD9AEE59, 0x97BCDFCEEB117B77, 0x190B390BECB2A305,
];
const ORDER: &'static [Word] = &[ 0xF80000084000000D, 0x240000036000001, 0xDDF8001294200000, 0x144480016CD10008, 0xFBEE7E0000000000, 0x44766363358CA889, 0xC000000000000000, 0x66C8673388B26B26, 0x0, 0x39DD931888240000,
];
const NEG_INV_ORD: &'static [Word] = &[ 0xB3BD595F7B13B13B, 0x98D6812928108BD3, 0x5BE5D62005B2FDFF, 0xE5B220E59E0B153A, 0x47A25D01D3625CC2, 0x5349511DA1BA97B9, 0x5B95BC1AD237AD90, 0x8D5F60FCC33B4785, 0xD4F63953B78DAA43, 0x1E4FD2F899AA6244,
];
const MONTY_N: &'static [Word] = &[ 0x5992FEF1C80D5FC4, 0x204E3428A70683FD, 0xDD0B26F6172C2526, 0x10389E31F3CC90F2, 0x8B6016921B9D5019, 0x8904B9C12A7AF1, 0x6B007716CF699585, 0xD0F5C0C8A263100, 0x379609183770F0B6, 0x3325F86ACF6AE6F9,
];
const SQRT_NEG_3: &'static [Word] = &[ 0xF000000300000004, 0x240000024000000, 0x38F00006C1800000, 0x14448000F3360004, 0xC11C3C0000000000, 0x4476636223B31B04, 0x8000000000000000, 0x66C86732BB219CC4, 0x0, 0x39DD931888240000,
];
const SVDW: &'static [Word] = &[ 0x800000066000000B, 0x24000002D000001, 0xC180000E5B300000, 0x1444800130038006, 0x9B60600000000000, 0x44766362AC9FE1C7, 0xA000000000000000, 0x66C8673321EA03F5, 0x0, 0x39DD931888240000,
];
const ZETA: &'static [Word] = &[ 0x9000000360000007, 0x0000000009000000, 0x8890000799B00000, 0x000000003CCD8002, 0xDA44240000000000, 0x0000000088ECC6C2, 0x2000000000000000, 0x0000000066C86731, 0x0000000000000000, 0x0000000000000000,
];
const THETA: &'static [Word] = &[ 0x4E28DEFD7EB04A9D, 0x7F5F7E57AF324E59, 0xFE28A26DFCE9E826, 0xBD6314F24B1F657A, 0xAE9B7FBC026DA822, 0x44B0AF1A6B8311D6, 0x8EB97336AC399800, 0xBB66E60350BED6A5, 0x2A3ABF53F9E21ADB, 0x2DC1309EB7DA0EEE,
];
const OMEGA: &'static [Word] = &[ 0x00000000C0000004, 0x0000000000000000, 0x00000001B0600000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const TRIPLES: Word = 170; }
pub struct BN702Param;
impl BNParam for BN702Param {
const U: &'static [Word] = &[ 0x0020000000002001, 0x0000000000000000, 0x0000410000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const LIMBS: usize = 11;
const MODULUS: &'static [Word] = &[ 0xC0036021009C013, 0xA202100900A20420, 0x611CCE3600000D80, 0xDA92286114894918, 0x36D949100036, 0x37B5FC7102964800, 0x6000006F695C6880, 0x6C000000000037B3, 0x6D9200004B6F5691, 0x4B, 0x264DA42400000000,
];
const NEG_INV_MOD: &'static [Word] = &[ 0x8A89EAC34457F5E5, 0xA6DEE06F4751C1EB, 0xE6A557E0642ACB45, 0x681EC38A841C3478, 0xF22AD035F2F00819, 0x2EE680A493ECCF6B, 0xF58B0303059E131F, 0x65162FB87DB16AB7, 0x8AAE6581FA357FD9, 0xE8A08B01D1ABDB8F, 0xE7FE7A1874568228,
];
const MONTY_P: &'static [Word] = &[ 0x660B6A1652A7DC3F, 0xEBFFD293202D540A, 0x53F883FB95620072, 0x4DAC63A3CE161627, 0x4D02C46D6AA140E7, 0x4FB57BC035BCBD7D, 0x1384F18E73531B2F, 0x1AF9B9C49A8743B1, 0xDB928CD3529FB2E2, 0x8E405630A53CA953, 0x233B0FF3EF7EDAAF,
];
const ORDER: &'static [Word] = &[ 0xA803601F808400D, 0xA201F80900A203F0, 0xFF99C23600000D80, 0xDA9227FF94894917, 0x36D949100036, 0x37B5FC709F904800, 0x6000006F695C6880, 0x6C000000000037B3, 0x6D9200004B6F5691, 0x4B, 0x264DA42400000000,
];
const NEG_INV_ORD: &'static [Word] = &[ 0xF08C2BE8E8C1F13B, 0x4B6C46F11B61BD2B, 0xA2FB1E2F75145DFB, 0xA393828A78764B8C, 0xB0B2329DC65968AE, 0x6CED521F0A85820E, 0xA89E862E2E2B3F1E, 0x21F2B187B45C51B7, 0x720143B26B1DB7C0, 0xB5CAA1650F802D42, 0x4C4064969ED58E3,
];
const MONTY_N: &'static [Word] = &[ 0xF6B8726D5E3AA644, 0xFBC708ECC7F0A599, 0xC0697C5B6372D0FF, 0x71395A6B7765B28E, 0x4D4E104E63631D8F, 0xCCC8BA9FDD61C162, 0x293E728D35DDEBB6, 0xC086F382AB75982D, 0x2F289E7DE1D804F, 0x9E33DEF16302B6BD, 0xEC855BFB5CE3D40,
];
const SQRT_NEG_3: &'static [Word] = &[ 0x5402400F0030004, 0x6C00F009006C01E0, 0xCF0F182400000D80, 0xD9B6C3CF1488DB63, 0x36D8DB600036, 0x37B51D9EDE4E4800, 0x6000006F687D9B00, 0x48000000000037B3, 0x6D9200004B6EBFB6, 0x4B, 0x264DA42400000000,
];
const SVDW: &'static [Word] = &[ 0x8A02D018006600B, 0x8701800900870300, 0x1815F32D00000D80, 0xDA2476181489123E, 0x36D912380036, 0x37B58D07F0724800, 0x6000006F68ED01C0, 0xDA000000000037B3, 0x6D9200004B6F0B23, 0x4B, 0x264DA42400000000,
];
const ZETA: &'static [Word] = &[ 0x0360090090036007, 0x1B009000001B0120, 0x4906DB0900000000, 0x006DB249000036DA, 0x0000000036D80000, 0x00006F6912240000, 0x00000000006F66C0, 0x9200000000000000, 0x0000000000004B6D, 0x0000000000000000, 0x0000000000000000,
];
const THETA: &'static [Word] = &[ 0xF9C538B896B77951, 0xC0740AFD47E4477E, 0xFD8C0A72295FFE99, 0xECBFECF16E199230, 0xB5037DCBE83691A7, 0xDAD487804D0D07F9, 0x7B286CF12E28E445, 0x19021FD271A2B0A2, 0x1F3B92DDDA12CE3D, 0xFEB336B257CB361A, 0x0A2922538EB9D300,
];
const OMEGA: &'static [Word] = &[ 0x00C000000000C004, 0x0000000000000000, 0x0001860000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const TRIPLES: Word = 186; }
pub struct BN766Param;
impl BNParam for BN766Param {
const U: &'static [Word] = &[ 0x0000000000000801, 0x0000000000000000, 0x4800000040000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const LIMBS: usize = 12;
const MODULUS: &'static [Word] = &[ 0x240D821027013, 0x0, 0x442101380000000, 0x5116CA525E, 0x4000000000000000, 0x78996C929360A208, 0x4464D12, 0xB2001201B0000000, 0x6718445E68403CC5, 0x24000000000019A3, 0x11600000A2000000, 0x39AA4000CD080001,
];
const NEG_INV_MOD: &'static [Word] = &[ 0xCDAF8043A0C525E5, 0xED5E9DA32E7C38DB, 0x1F701FECA852DA25, 0xB1DCCC56509F8596, 0xE9C4FFD651D24808, 0x56D6011E21691A28, 0x142DC05D035400D3, 0x9C925810E0ED2CAB, 0xA0D339C4D65F532C, 0x842CB2FA8B92B067, 0xD7F793ABD7A5A7CE, 0x7A19DF8ABB39C4CE,
];
const MONTY_P: &'static [Word] = &[ 0xE1A66C324F546628, 0x1B9B39E585B59694, 0x99019B52C9CB1098, 0xFFE5F03E74F63F17, 0x333D4F00CF7A6BC2, 0x54D2C263C886FC37, 0x5A08B37C128E365D, 0x616F164271EEB2C2, 0x971D190CE3225860, 0x5902667FA15A310E, 0xF97E2F4724038FFC, 0x39193E63A38C3270,
];
const ORDER: &'static [Word] = &[ 0x240D81F82100D, 0x0, 0xA441F81080000000, 0x5116CA375A, 0xE000000000000000, 0xFF196C91BB60A207, 0x4464D11, 0xB2001201B0000000, 0x6718445E68403CC5, 0x24000000000019A3, 0x11600000A2000000, 0x39AA4000CD080001,
];
const NEG_INV_ORD: &'static [Word] = &[ 0x37FD7A4522FF413B, 0x36D9EE52B06452AF, 0x6FEAF464DE7E4E6A, 0x3500634424B16F48, 0x753CB754AD3A64E7, 0xDE93A88E7AE55834, 0xF61270196C86D3E5, 0x5576907F96A2FAF7, 0xC7DDD790A578D420, 0x1CD9F09FD8862CC1, 0x8DD7440E2B5C531, 0x956DFAEF7E1B459D,
];
const MONTY_N: &'static [Word] = &[ 0xB56213166833C120, 0x55D2679633E5367D, 0x78B9F074DFC054EB, 0x5B69503983E7C641, 0x3FD43E6430FE3EC2, 0xDDF1D9748F48FECC, 0x23DFB4EE0FAA44B4, 0x9082E75E74B6C530, 0x5347F67A8359C6A5, 0x411604AD9ED98D4F, 0x3635D9D3E850D236, 0x1E5D9F750933844D,
];
const SQRT_NEG_3: &'static [Word] = &[ 0x240900F00C004, 0x0, 0xCD80F00600000000, 0x510F310E4E, 0xC000000000000000, 0xC698F30873606C03, 0x44608B4, 0xCC00120120000000, 0x9A10445C45803CC3, 0x24000000000019A2, 0x11600000A2000000, 0x39AA4000CD080001,
];
const SVDW: &'static [Word] = &[ 0x240B41801980B, 0x0, 0x68E1800CC0000000, 0x5112FDB056, 0x0, 0x9F992FCD83608706, 0x4462AE3, 0xBF00120168000000, 0x94445D56E03CC4, 0x24000000000019A3, 0x11600000A2000000, 0x39AA4000CD080001,
];
const ZETA: &'static [Word] = &[ 0x000000240900D807, 0x0000000000000000, 0x9B609006C0000000, 0x0000000003CCA207, 0x4000000000000000, 0xD9003CC510001B02, 0x000000000000222E, 0xF300000048000000, 0x6684000111600000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const THETA: &'static [Word] = &[ 0x776B50417AE1271E, 0x34D15830C8B433F4, 0x02480677E05652DC, 0x1DF4DDBBA5C373A1, 0xF3EF7D5D2FFCC217, 0x81360A05723FD1F1, 0xAEA591048D30242C, 0x9155991C645B8C53, 0xA90BEC568F0790EA, 0xA40039C4E4633099, 0xD04FC3702168DB32, 0x2FC8E54C2B7B192C,
];
const OMEGA: &'static [Word] = &[ 0x0000000000003004, 0x0000000000000000, 0xB000000180000000, 0x0000000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
];
const TRIPLES: Word = 202; }