pairing-plus 0.19.0

Pairing-friendly elliptic curve library
Documentation
/*!
Addition chains for computing square roots.
* chain_pm3div4: input x, output x^((p-3)//4).
* chain_p2m9div16: input x, output x^((p**2 - 9) // 16).
*/

use bls12_381::{Fq, Fq2};
use ff::Field;

#[allow(clippy::cognitive_complexity)]
/* *** addchain for 1000602388805416848354447456433976039139220704984751971333014534031007912622709466110671907282253916009473568139946 *** */
/* Bos-Coster (win=4) : 458 links, 16 variables */
/// Addition chain implementing exponentiation by (p - 3) // 4.
pub fn chain_pm3div4(tmpvar1: &mut Fq, tmpvar0: &Fq) {
    *tmpvar1 = *tmpvar0;
    tmpvar1.square();
    //Self::sqr(tmpvar1, tmpvar0);                              /*    0 : 2 */
    let mut tmpvar9 = *tmpvar1;
    tmpvar9.mul_assign(tmpvar0);
    //Self::mul(&mut tmpvar9, tmpvar1, tmpvar0);                /*    1 : 3 */
    let mut tmpvar5 = *tmpvar1;
    tmpvar5.square();
    //Self::sqr(&mut tmpvar5, tmpvar1);                         /*    2 : 4 */
    let mut tmpvar2 = tmpvar9;
    tmpvar2.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar2, &tmpvar9, tmpvar1);               /*    3 : 5 */
    let mut tmpvar7 = tmpvar5;
    tmpvar7.mul_assign(&tmpvar9);
    //Self::mul(&mut tmpvar7, &tmpvar5, &tmpvar9);              /*    4 : 7 */
    let mut tmpvar10 = tmpvar2;
    tmpvar10.mul_assign(&tmpvar5);
    //Self::mul(&mut tmpvar10, &tmpvar2, &tmpvar5);             /*    5 : 9 */
    let mut tmpvar13 = tmpvar7;
    tmpvar13.mul_assign(&tmpvar5);
    //Self::mul(&mut tmpvar13, &tmpvar7, &tmpvar5);             /*    6 : 11 */
    let mut tmpvar4 = tmpvar10;
    tmpvar4.mul_assign(&tmpvar5);
    //Self::mul(&mut tmpvar4, &tmpvar10, &tmpvar5);             /*    7 : 13 */
    let mut tmpvar8 = tmpvar13;
    tmpvar8.mul_assign(&tmpvar5);
    //Self::mul(&mut tmpvar8, &tmpvar13, &tmpvar5);             /*    8 : 15 */
    let mut tmpvar15 = tmpvar4;
    tmpvar15.mul_assign(&tmpvar5);
    //Self::mul(&mut tmpvar15, &tmpvar4, &tmpvar5);             /*    9 : 17 */
    let mut tmpvar11 = tmpvar8;
    tmpvar11.mul_assign(&tmpvar5);
    //Self::mul(&mut tmpvar11, &tmpvar8, &tmpvar5);             /*   10 : 19 */
    let mut tmpvar3 = tmpvar15;
    tmpvar3.mul_assign(&tmpvar5);
    //Self::mul(&mut tmpvar3, &tmpvar15, &tmpvar5);             /*   11 : 21 */
    let mut tmpvar12 = tmpvar11;
    tmpvar12.mul_assign(&tmpvar5);
    //Self::mul(&mut tmpvar12, &tmpvar11, &tmpvar5);            /*   12 : 23 */
    *tmpvar1 = tmpvar4;
    tmpvar1.square();
    //Self::sqr(tmpvar1, &tmpvar4);                             /*   13 : 26 */
    let mut tmpvar14 = tmpvar12;
    tmpvar14.mul_assign(&tmpvar5);
    //Self::mul(&mut tmpvar14, &tmpvar12, &tmpvar5);            /*   14 : 27 */
    let mut tmpvar6 = *tmpvar1;
    tmpvar6.mul_assign(&tmpvar9);
    //Self::mul(&mut tmpvar6, tmpvar1, &tmpvar9);               /*   15 : 29 */
    let mut tmpvar5 = *tmpvar1;
    tmpvar5.mul_assign(&tmpvar2);
    //Self::mul(&mut tmpvar5, tmpvar1, &tmpvar2);               /*   16 : 31 */
    for _ in 0..12 {
        tmpvar1.square();
    } /*   17 : 106496 */
    tmpvar1.mul_assign(&tmpvar15); /*   29 : 106513 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*   30 : 13633664 */
    tmpvar1.mul_assign(&tmpvar8); /*   37 : 13633679 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*   38 : 218138864 */
    tmpvar1.mul_assign(&tmpvar2); /*   42 : 218138869 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*   43 : 13960887616 */
    tmpvar1.mul_assign(&tmpvar7); /*   49 : 13960887623 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*   50 : 1786993615744 */
    tmpvar1.mul_assign(&tmpvar12); /*   57 : 1786993615767 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*   58 : 57183795704544 */
    tmpvar1.mul_assign(&tmpvar5); /*   63 : 57183795704575 */
    for _ in 0..2 {
        tmpvar1.square();
    } /*   64 : 228735182818300 */
    tmpvar1.mul_assign(&tmpvar9); /*   66 : 228735182818303 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*   67 : 14639051700371392 */
    tmpvar1.mul_assign(&tmpvar4); /*   73 : 14639051700371405 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*   74 : 936899308823769920 */
    tmpvar1.mul_assign(&tmpvar4); /*   80 : 936899308823769933 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*   81 : 59961555764721275712 */
    tmpvar1.mul_assign(&tmpvar10); /*   87 : 59961555764721275721 */
    for _ in 0..3 {
        tmpvar1.square();
    } /*   88 : 479692446117770205768 */
    tmpvar1.mul_assign(&tmpvar9); /*   91 : 479692446117770205771 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*   92 : 61400633103074586338688 */
    tmpvar1.mul_assign(&tmpvar4); /*   99 : 61400633103074586338701 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  100 : 982410129649193381419216 */
    tmpvar1.mul_assign(&tmpvar4); /*  104 : 982410129649193381419229 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  105 : 62874248297548376410830656 */
    tmpvar1.mul_assign(&tmpvar8); /*  111 : 62874248297548376410830671 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  112 : 4023951891043096090293162944 */
    tmpvar1.mul_assign(&tmpvar14); /*  118 : 4023951891043096090293162971 */
    for _ in 0..3 {
        tmpvar1.square();
    } /*  119 : 32191615128344768722345303768 */
    tmpvar1.mul_assign(tmpvar0); /*  122 : 32191615128344768722345303769 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  123 : 8241053472856260792920397764864 */
    tmpvar1.mul_assign(&tmpvar4); /*  131 : 8241053472856260792920397764877 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  132 : 1054854844525601381493810913904256 */
    tmpvar1.mul_assign(&tmpvar12); /*  139 : 1054854844525601381493810913904279 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  140 : 33755355024819244207801949244936928 */
    tmpvar1.mul_assign(&tmpvar13); /*  145 : 33755355024819244207801949244936939 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  146 : 2160342721588431629299324751675964096 */
    tmpvar1.mul_assign(&tmpvar4); /*  152 : 2160342721588431629299324751675964109 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  153 : 138261934181659624275156784107261702976 */
    tmpvar1.mul_assign(&tmpvar6); /*  159 : 138261934181659624275156784107261703005 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  160 : 2212190946906553988402508545716187248080 */
    tmpvar1.mul_assign(&tmpvar10); /*  164 : 2212190946906553988402508545716187248089 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  165 : 566320882408077821031042187703343935510784 */
    tmpvar1.mul_assign(&tmpvar6); /*  173 : 566320882408077821031042187703343935510813 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  174 : 9061134118529245136496675003253502968173008 */
    tmpvar1.mul_assign(&tmpvar4); /*  178 : 9061134118529245136496675003253502968173021 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  179 : 1159825167171743377471574400416448379926146688 */
    tmpvar1.mul_assign(&tmpvar12); /*  186 : 1159825167171743377471574400416448379926146711 */
    for _ in 0..9 {
        tmpvar1.square();
    } /*  187 : 593830485591932609265446093013221570522187116032 */
    tmpvar1.mul_assign(&tmpvar11); /*  196 : 593830485591932609265446093013221570522187116051 */
    for _ in 0..2 {
        tmpvar1.square();
    } /*  197 : 2375321942367730437061784372052886282088748464204 */
    tmpvar1.mul_assign(&tmpvar9); /*  199 : 2375321942367730437061784372052886282088748464207 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  200 : 76010302155767373985977099905692361026839950854624 */
    tmpvar1.mul_assign(&tmpvar7); /*  205 : 76010302155767373985977099905692361026839950854631 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  206 : 9729318675938223870205068787928622211435513709392768 */
    tmpvar1.mul_assign(&tmpvar2); /*  213 : 9729318675938223870205068787928622211435513709392773 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  214 : 1245352790520092655386248804854863643063745754802274944 */
    tmpvar1.mul_assign(&tmpvar10); /*  221 : 1245352790520092655386248804854863643063745754802274953 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  222 : 79702578593285929944719923510711273156079728307345596992 */
    tmpvar1.mul_assign(&tmpvar12); /*  228 : 79702578593285929944719923510711273156079728307345597015 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  229 : 2550482514985149758231037552342760740994551305835059104480 */
    tmpvar1.mul_assign(&tmpvar6); /*  234 : 2550482514985149758231037552342760740994551305835059104509 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  235 : 81615440479524792263393201674968343711825641786721891344288 */
    tmpvar1.mul_assign(&tmpvar11); /*  240 : 81615440479524792263393201674968343711825641786721891344307 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  241 : 2611694095344793352428582453598986998778420537175100523017824 */
    tmpvar1.mul_assign(&tmpvar11); /*  246 : 2611694095344793352428582453598986998778420537175100523017843 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  247 : 668593688408267098221717108121340671687275657516825733892567808 */
    tmpvar1.mul_assign(&tmpvar4); /*  255 : 668593688408267098221717108121340671687275657516825733892567821 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  256 : 85579992116258188572379789839531605975971284162153693938248681088 */
    tmpvar1.mul_assign(&tmpvar3); /*  263 : 85579992116258188572379789839531605975971284162153693938248681109 */
    for _ in 0..9 {
        tmpvar1.square();
    } /*  264 : 43816955963524192549058452397840182259697297491022691296383324727808 */
    tmpvar1.mul_assign(&tmpvar8); /*  273 : 43816955963524192549058452397840182259697297491022691296383324727823 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  274 : 1402142590832774161569870476730885832310313519712726121484266391290336 */
    tmpvar1.mul_assign(&tmpvar4); /*  279 : 1402142590832774161569870476730885832310313519712726121484266391290349 */
    for _ in 0..3 {
        tmpvar1.square();
    } /*  280 : 11217140726662193292558963813847086658482508157701808971874131130322792 */
    tmpvar1.mul_assign(&tmpvar9); /*  283 : 11217140726662193292558963813847086658482508157701808971874131130322795 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  284 : 2871588026025521482895094736344854184571522088371663096799777569362635520 */
    tmpvar1.mul_assign(&tmpvar8); /*  292 : 2871588026025521482895094736344854184571522088371663096799777569362635535 */
    for _ in 0..3 {
        tmpvar1.square();
    } /*  293 : 22972704208204171863160757890758833476572176706973304774398220554901084280 */
    tmpvar1.mul_assign(&tmpvar9); /*  296 : 22972704208204171863160757890758833476572176706973304774398220554901084283 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  297 : 2940506138650133998484577010017130685001238618492583011122972231027338788224 */
    tmpvar1.mul_assign(&tmpvar10); /*  304 : 2940506138650133998484577010017130685001238618492583011122972231027338788233 */
    for _ in 0..9 {
        tmpvar1.square();
    } /*  305 : 1505539142988868607224103429128770910720634172668202501694961782285997459575296 */
    tmpvar1.mul_assign(&tmpvar8); /*  314 : 1505539142988868607224103429128770910720634172668202501694961782285997459575311 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  315 : 96354505151287590862342619464241338286120587050764960108477554066303837412819904 */
    tmpvar1.mul_assign(&tmpvar3); /*  321 : 96354505151287590862342619464241338286120587050764960108477554066303837412819925 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  322 : 6166688329682405815189927645711445650311717571248957446942563460243445594420475200 */
    tmpvar1.mul_assign(&tmpvar5); /*  328 : 6166688329682405815189927645711445650311717571248957446942563460243445594420475231 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  329 : 197334026549836986086077684662766260809974962279966638302162030727790259021455207392 */
    tmpvar1.mul_assign(&tmpvar5); /*  334 : 197334026549836986086077684662766260809974962279966638302162030727790259021455207423 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  335 : 6314688849594783554754485909208520345919198792958932425669184983289288288686566637536 */
    tmpvar1.mul_assign(&tmpvar5); /*  340 : 6314688849594783554754485909208520345919198792958932425669184983289288288686566637567 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  341 : 101035021593516536876071774547336325534707180687342918810706959732628612618985066201072 */
    tmpvar1.mul_assign(&tmpvar4); /*  345 : 101035021593516536876071774547336325534707180687342918810706959732628612618985066201085 */
    for _ in 0..3 {
        tmpvar1.square();
    } /*  346 : 808280172748132295008574196378690604277657445498743350485655677861028900951880529608680 */
    tmpvar1.mul_assign(&tmpvar9); /*  349 : 808280172748132295008574196378690604277657445498743350485655677861028900951880529608683 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  350 : 206919724223521867522194994272944794695080306047678297724327853532423398643681415579822848 */
    tmpvar1.mul_assign(&tmpvar3); /*  358 : 206919724223521867522194994272944794695080306047678297724327853532423398643681415579822869 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  359 : 26485724700610799042840959266936933720970279174102822108713965252150195026391221194217327232 */
    tmpvar1.mul_assign(&tmpvar5); /*  366 : 26485724700610799042840959266936933720970279174102822108713965252150195026391221194217327263 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  367 : 847543190419545569370910696541981879071048933571290307478846888068806240844519078214954472416 */
    tmpvar1.mul_assign(&tmpvar5); /*  372 : 847543190419545569370910696541981879071048933571290307478846888068806240844519078214954472447 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  373 : 27121382093425458219869142289343420130273565874281289839323100418201799707024610502878543118304 */
    tmpvar1.mul_assign(&tmpvar5); /*  378 : 27121382093425458219869142289343420130273565874281289839323100418201799707024610502878543118335 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  379 : 433942113494807331517906276629494722084377053988500637429169606691228795312393768046056689893360 */
    tmpvar1.mul_assign(&tmpvar8); /*  383 : 433942113494807331517906276629494722084377053988500637429169606691228795312393768046056689893375 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  384 : 6943073815916917304286500426071915553350032863816010198866713707059660724998300288736907038294000 */
    tmpvar1.mul_assign(&tmpvar7); /*  388 : 6943073815916917304286500426071915553350032863816010198866713707059660724998300288736907038294007 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  389 : 888713448437365414948672054537205190828804206568449305454939354503636572799782436958324100901632896 */
    tmpvar1.mul_assign(&tmpvar5); /*  396 : 888713448437365414948672054537205190828804206568449305454939354503636572799782436958324100901632927 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  397 : 28438830349995693278357505745190566106521734610190377774558059344116370329593037982666371228852253664 */
    tmpvar1.mul_assign(&tmpvar6); /*  402 : 28438830349995693278357505745190566106521734610190377774558059344116370329593037982666371228852253693 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  403 : 910042571199862184907440183846098115408695507526092088785857899011723850546977215445323879323272118176 */
    tmpvar1.mul_assign(&tmpvar5); /*  408 : 910042571199862184907440183846098115408695507526092088785857899011723850546977215445323879323272118207 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  409 : 29121362278395589917038085883075139693078256240834946841147452768375163217503270894250364138344707782624 */
    tmpvar1.mul_assign(&tmpvar5); /*  414 : 29121362278395589917038085883075139693078256240834946841147452768375163217503270894250364138344707782655 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  415 : 931883592908658877345218748258404470178504199706718298916718488588005222960104668616011652427030649044960 */
    tmpvar1.mul_assign(&tmpvar5); /*  420 : 931883592908658877345218748258404470178504199706718298916718488588005222960104668616011652427030649044991 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  421 : 29820274973077084075046999944268943045712134390614985565334991634816167134723349395712372877664980769439712 */
    tmpvar1.mul_assign(&tmpvar5); /*  426 : 29820274973077084075046999944268943045712134390614985565334991634816167134723349395712372877664980769439743 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  427 : 954248799138466690401503998216606177462788300499679538090719732314117348311147180662795932085279384622071776 */
    tmpvar1.mul_assign(&tmpvar5); /*  432 : 954248799138466690401503998216606177462788300499679538090719732314117348311147180662795932085279384622071807 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  433 : 30535961572430934092848127942931397678809225615989745218903031434051755145956709781209469826728940307906297824 */
    tmpvar1.mul_assign(&tmpvar5); /*  438 : 30535961572430934092848127942931397678809225615989745218903031434051755145956709781209469826728940307906297855 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  439 : 488575385158894945485570047086902362860947609855835923502448502944828082335307356499351517227663044926500765680 */
    tmpvar1.mul_assign(&tmpvar4); /*  443 : 488575385158894945485570047086902362860947609855835923502448502944828082335307356499351517227663044926500765693 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  444 : 31268824650169276511076483013561751223100647030773499104156704188468997269459670815958497102570434875296049004352 */
    tmpvar1.mul_assign(&tmpvar3); /*  450 : 31268824650169276511076483013561751223100647030773499104156704188468997269459670815958497102570434875296049004373 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  451 : 500301194402708424177223728216988019569610352492375985666507267015503956311354733055335953641126958004736784069968 */
    tmpvar1.mul_assign(&tmpvar2); /*  455 : 500301194402708424177223728216988019569610352492375985666507267015503956311354733055335953641126958004736784069973 */
    tmpvar1.square(); /*  456 : 1000602388805416848354447456433976039139220704984751971333014534031007912622709466110671907282253916009473568139946 */
}

#[allow(clippy::cognitive_complexity)]
/* *** addchain for 1001205140483106588246484290269935788605945006208159541241399033561623546780709821462541004956387089373434649096260670658193992783731681621012512651314777238193313314641988297376025498093520728838658813979860931248214124593092835 *** */
/* Bos-Coster (win=4) : 895 links, 17 variables */
/// Addition chain implementing exponentiation by (p**2 - 9) // 16.
pub fn chain_p2m9div16(tmpvar1: &mut Fq2, tmpvar0: &Fq2) {
    *tmpvar1 = *tmpvar0;
    tmpvar1.square();
    //Self::sqr(tmpvar1, tmpvar0);                              /*    0 : 2 */
    let mut tmpvar2 = *tmpvar1;
    tmpvar2.mul_assign(tmpvar0);
    //Self::mul(&mut tmpvar2, tmpvar1, tmpvar0);                /*    1 : 3 */
    let mut tmpvar15 = tmpvar2;
    tmpvar15.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar15, &tmpvar2, tmpvar1);              /*    2 : 5 */
    let mut tmpvar3 = tmpvar15;
    tmpvar3.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar3, &tmpvar15, tmpvar1);              /*    3 : 7 */
    let mut tmpvar14 = tmpvar3;
    tmpvar14.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar14, &tmpvar3, tmpvar1);              /*    4 : 9 */
    let mut tmpvar13 = tmpvar14;
    tmpvar13.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar13, &tmpvar14, tmpvar1);             /*    5 : 11 */
    let mut tmpvar5 = tmpvar13;
    tmpvar5.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar5, &tmpvar13, tmpvar1);              /*    6 : 13 */
    let mut tmpvar10 = tmpvar5;
    tmpvar10.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar10, &tmpvar5, tmpvar1);              /*    7 : 15 */
    let mut tmpvar9 = tmpvar10;
    tmpvar9.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar9, &tmpvar10, tmpvar1);              /*    8 : 17 */
    let mut tmpvar16 = tmpvar9;
    tmpvar16.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar16, &tmpvar9, tmpvar1);              /*    9 : 19 */
    let mut tmpvar4 = tmpvar16;
    tmpvar4.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar4, &tmpvar16, tmpvar1);              /*   10 : 21 */
    let mut tmpvar7 = tmpvar4;
    tmpvar7.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar7, &tmpvar4, tmpvar1);               /*   11 : 23 */
    let mut tmpvar6 = tmpvar7;
    tmpvar6.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar6, &tmpvar7, tmpvar1);               /*   12 : 25 */
    let mut tmpvar12 = tmpvar6;
    tmpvar12.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar12, &tmpvar6, tmpvar1);              /*   13 : 27 */
    let mut tmpvar8 = tmpvar12;
    tmpvar8.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar8, &tmpvar12, tmpvar1);              /*   14 : 29 */
    let mut tmpvar11 = tmpvar8;
    tmpvar11.mul_assign(tmpvar1);
    //Self::mul(&mut tmpvar11, &tmpvar8, tmpvar1);              /*   15 : 31 */
    *tmpvar1 = tmpvar4;
    tmpvar1.square();
    //Self::sqr(tmpvar1, &tmpvar4);                             /*   16 : 42 */
    for _ in 0..2 {
        tmpvar1.square();
    } /*   17 : 168 */
    tmpvar1.mul_assign(tmpvar0); /*   19 : 169 */
    for _ in 0..9 {
        tmpvar1.square();
    } /*   20 : 86528 */
    tmpvar1.mul_assign(&tmpvar12); /*   29 : 86555 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*   30 : 1384880 */
    tmpvar1.mul_assign(&tmpvar5); /*   34 : 1384893 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*   35 : 88633152 */
    tmpvar1.mul_assign(&tmpvar14); /*   41 : 88633161 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*   42 : 1418130576 */
    tmpvar1.mul_assign(&tmpvar3); /*   46 : 1418130583 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*   47 : 45380178656 */
    tmpvar1.mul_assign(&tmpvar2); /*   52 : 45380178659 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*   53 : 11617325736704 */
    tmpvar1.mul_assign(&tmpvar5); /*   61 : 11617325736717 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*   62 : 185877211787472 */
    tmpvar1.mul_assign(&tmpvar3); /*   66 : 185877211787479 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*   67 : 2974035388599664 */
    tmpvar1.mul_assign(&tmpvar10); /*   71 : 2974035388599679 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*   72 : 761353059481517824 */
    tmpvar1.mul_assign(&tmpvar8); /*   80 : 761353059481517853 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*   81 : 48726595806817142592 */
    tmpvar1.mul_assign(&tmpvar13); /*   87 : 48726595806817142603 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*   88 : 779625532909074281648 */
    tmpvar1.mul_assign(&tmpvar5); /*   92 : 779625532909074281661 */
    for _ in 0..3 {
        tmpvar1.square();
    } /*   93 : 6237004263272594253288 */
    tmpvar1.mul_assign(tmpvar0); /*   96 : 6237004263272594253289 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*   97 : 399168272849446032210496 */
    tmpvar1.mul_assign(&tmpvar10); /*  103 : 399168272849446032210511 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  104 : 102187077849458184245890816 */
    tmpvar1.mul_assign(&tmpvar8); /*  112 : 102187077849458184245890845 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  113 : 6539972982365323791737014080 */
    tmpvar1.mul_assign(&tmpvar4); /*  119 : 6539972982365323791737014101 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  120 : 1674233083485522890684675609856 */
    tmpvar1.mul_assign(&tmpvar9); /*  128 : 1674233083485522890684675609873 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  129 : 53575458671536732501909619515936 */
    tmpvar1.mul_assign(&tmpvar10); /*  134 : 53575458671536732501909619515951 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  135 : 3428829354978350880122215649020864 */
    tmpvar1.mul_assign(&tmpvar14); /*  141 : 3428829354978350880122215649020873 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  142 : 109722539359307228163910900768667936 */
    tmpvar1.mul_assign(&tmpvar10); /*  147 : 109722539359307228163910900768667951 */
    for _ in 0..2 {
        tmpvar1.square();
    } /*  148 : 438890157437228912655643603074671804 */
    tmpvar1.mul_assign(tmpvar0); /*  150 : 438890157437228912655643603074671805 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  151 : 28088970075982650409961190596778995520 */
    tmpvar1.mul_assign(&tmpvar10); /*  157 : 28088970075982650409961190596778995535 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  158 : 3595388169725779252475032396387711428480 */
    tmpvar1.mul_assign(&tmpvar13); /*  165 : 3595388169725779252475032396387711428491 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  166 : 57526210715612468039600518342203382855856 */
    tmpvar1.mul_assign(&tmpvar3); /*  170 : 57526210715612468039600518342203382855863 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  171 : 3681677485799197954534433173901016502775232 */
    tmpvar1.mul_assign(&tmpvar14); /*  177 : 3681677485799197954534433173901016502775241 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  178 : 471254718182297338180407446259330112355230848 */
    tmpvar1.mul_assign(&tmpvar3); /*  185 : 471254718182297338180407446259330112355230855 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  186 : 15080150981833514821773038280298563595367387360 */
    tmpvar1.mul_assign(&tmpvar15); /*  191 : 15080150981833514821773038280298563595367387365 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  192 : 1930259325674689897186948899878216140207025582720 */
    tmpvar1.mul_assign(&tmpvar3); /*  199 : 1930259325674689897186948899878216140207025582727 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  200 : 61768298421590076709982364796102916486624818647264 */
    tmpvar1.mul_assign(&tmpvar3); /*  205 : 61768298421590076709982364796102916486624818647271 */
    for _ in 0..10 {
        tmpvar1.square();
    } /*  206 : 63250737583708238551021941551209386482303814294805504 */
    tmpvar1.mul_assign(&tmpvar9); /*  216 : 63250737583708238551021941551209386482303814294805521 */
    for _ in 0..3 {
        tmpvar1.square();
    } /*  217 : 506005900669665908408175532409675091858430514358444168 */
    tmpvar1.mul_assign(&tmpvar15); /*  220 : 506005900669665908408175532409675091858430514358444173 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  221 : 16192188821429309069061617037109602939469776459470213536 */
    tmpvar1.mul_assign(&tmpvar5); /*  226 : 16192188821429309069061617037109602939469776459470213549 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  227 : 4145200338285903121679773961500058352504262773624374668544 */
    tmpvar1.mul_assign(&tmpvar6); /*  235 : 4145200338285903121679773961500058352504262773624374668569 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  236 : 132646410825148899893752766768001867280136408755979989394208 */
    tmpvar1.mul_assign(&tmpvar7); /*  241 : 132646410825148899893752766768001867280136408755979989394231 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  242 : 8489370292809529593200177073152119505928730160382719321230784 */
    tmpvar1.mul_assign(&tmpvar13); /*  248 : 8489370292809529593200177073152119505928730160382719321230795 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  249 : 543319698739809893964811332681735648379438730264494036558770880 */
    tmpvar1.mul_assign(&tmpvar10); /*  255 : 543319698739809893964811332681735648379438730264494036558770895 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  256 : 34772460719347833213747925291631081496284078736927618339761337280 */
    tmpvar1.mul_assign(&tmpvar14); /*  262 : 34772460719347833213747925291631081496284078736927618339761337289 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  263 : 4450874972076522651359734437328778431524362078326735147489451172992 */
    tmpvar1.mul_assign(&tmpvar16); /*  270 : 4450874972076522651359734437328778431524362078326735147489451173011 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  271 : 142427999106448724843511501994520909808779586506455524719662437536352 */
    tmpvar1.mul_assign(&tmpvar14); /*  276 : 142427999106448724843511501994520909808779586506455524719662437536361 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  277 : 9115391942812718389984736127649338227761893536413153582058396002327104 */
    tmpvar1.mul_assign(&tmpvar10); /*  283 : 9115391942812718389984736127649338227761893536413153582058396002327119 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  284 : 583385084340013976959023112169557646576761186330441829251737344148935616 */
    tmpvar1.mul_assign(&tmpvar9); /*  290 : 583385084340013976959023112169557646576761186330441829251737344148935633 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  291 : 18668322698880447262688739589425844690456357962574138536055595012765940256 */
    tmpvar1.mul_assign(&tmpvar10); /*  296 : 18668322698880447262688739589425844690456357962574138536055595012765940271 */
    for _ in 0..2 {
        tmpvar1.square();
    } /*  297 : 74673290795521789050754958357703378761825431850296554144222380051063761084 */
    tmpvar1.mul_assign(tmpvar0); /*  299 : 74673290795521789050754958357703378761825431850296554144222380051063761085 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  300 : 19116362443653577996993269339572064963027310553675917860920929293072322837760 */
    tmpvar1.mul_assign(&tmpvar15); /*  308 : 19116362443653577996993269339572064963027310553675917860920929293072322837765 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  309 : 2446894392787657983615138475465224315267495750870517486197878949513257323233920 */
    tmpvar1.mul_assign(&tmpvar15); /*  316 : 2446894392787657983615138475465224315267495750870517486197878949513257323233925 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  317 : 39150310284602527737842215607443589044279932013928279779166063192212117171742800 */
    tmpvar1.mul_assign(&tmpvar2); /*  321 : 39150310284602527737842215607443589044279932013928279779166063192212117171742803 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  322 : 5011239716429123550443803597752779397667831297782819811733256088603150997983078784 */
    tmpvar1.mul_assign(&tmpvar13); /*  329 : 5011239716429123550443803597752779397667831297782819811733256088603150997983078795 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  330 : 320719341851463907228403430256177881450741203058100467950928389670601663870917042880 */
    tmpvar1.mul_assign(&tmpvar10); /*  336 : 320719341851463907228403430256177881450741203058100467950928389670601663870917042895 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  337 : 5131509469623422515654454884098846103211859248929607487214854234729626621934672686320 */
    tmpvar1.mul_assign(&tmpvar5); /*  341 : 5131509469623422515654454884098846103211859248929607487214854234729626621934672686333 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  342 : 656833212111798082003770225164652301211117983862989758363501342045392207607638103850624 */
    tmpvar1.mul_assign(&tmpvar13); /*  349 : 656833212111798082003770225164652301211117983862989758363501342045392207607638103850635 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  350 : 42037325575155077248241294410537747277511550967231344535264085890905101286888838646440640 */
    tmpvar1.mul_assign(&tmpvar12); /*  356 : 42037325575155077248241294410537747277511550967231344535264085890905101286888838646440667 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  357 : 1345194418404962471943721421137207912880369630951403025128450748508963241180442836686101344 */
    tmpvar1.mul_assign(&tmpvar7); /*  362 : 1345194418404962471943721421137207912880369630951403025128450748508963241180442836686101367 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  363 : 43046221388958799102199085476390653212171828190444896804110423952286823717774170773955243744 */
    tmpvar1.mul_assign(&tmpvar15); /*  368 : 43046221388958799102199085476390653212171828190444896804110423952286823717774170773955243749 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  369 : 5509916337786726285081482940978003611157994008376946790926134265892713435875093859066271199872 */
    tmpvar1.mul_assign(&tmpvar12); /*  376 : 5509916337786726285081482940978003611157994008376946790926134265892713435875093859066271199899 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  377 : 176317322809175241122607454111296115557055808268062297309636296508566829948003003490120678396768 */
    tmpvar1.mul_assign(&tmpvar7); /*  382 : 176317322809175241122607454111296115557055808268062297309636296508566829948003003490120678396791 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  383 : 5642154329893607715923438531561475697825785864577993513908361488274138558336096111683861708697312 */
    tmpvar1.mul_assign(&tmpvar4); /*  388 : 5642154329893607715923438531561475697825785864577993513908361488274138558336096111683861708697333 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  389 : 90274469278297723454775016504983611165212573833247896222533783812386216933377537786941787339157328 */
    tmpvar1.mul_assign(&tmpvar2); /*  393 : 90274469278297723454775016504983611165212573833247896222533783812386216933377537786941787339157331 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  394 : 5777566033811054301105601056318951114573604725327865358242162163992717883736162418364274389706069184 */
    tmpvar1.mul_assign(&tmpvar15); /*  400 : 5777566033811054301105601056318951114573604725327865358242162163992717883736162418364274389706069189 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  401 : 369764226163907475270758467604412871332710702420983382927498378495533944559114394775313560941188428096 */
    tmpvar1.mul_assign(&tmpvar14); /*  407 : 369764226163907475270758467604412871332710702420983382927498378495533944559114394775313560941188428105 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  408 : 5916227618622519604332135481670605941323371238735734126839974055928543112945830316405016975059014849680 */
    tmpvar1.mul_assign(&tmpvar2); /*  412 : 5916227618622519604332135481670605941323371238735734126839974055928543112945830316405016975059014849683 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  413 : 94659641897960313669314167706729695061173939819771746029439584894856689807133285062480271600944237594928 */
    tmpvar1.mul_assign(&tmpvar2); /*  417 : 94659641897960313669314167706729695061173939819771746029439584894856689807133285062480271600944237594931 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  418 : 24232868325877840299344426932922801935660528593861566983536533733083312590626120975994949529841724824302336 */
    tmpvar1.mul_assign(&tmpvar14); /*  426 : 24232868325877840299344426932922801935660528593861566983536533733083312590626120975994949529841724824302345 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  427 : 775451786428090889579021661853529661941136915003570143473169079458666002900035871231838384954935194377675040 */
    tmpvar1.mul_assign(&tmpvar10); /*  432 : 775451786428090889579021661853529661941136915003570143473169079458666002900035871231838384954935194377675055 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  433 : 49628914331397816933057386358625898364232762560228489182282821085354624185602295758837656637115852440171203520 */
    tmpvar1.mul_assign(&tmpvar3); /*  439 : 49628914331397816933057386358625898364232762560228489182282821085354624185602295758837656637115852440171203527 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  440 : 1588125258604730141857836363476028747655448401927311653833050274731347973939273464282805012387707278085478512864 */
    tmpvar1.mul_assign(&tmpvar10); /*  445 : 1588125258604730141857836363476028747655448401927311653833050274731347973939273464282805012387707278085478512879 */
    for _ in 0..12 {
        tmpvar1.square();
    } /*  446 : 6504961059244974661049697744797813750396716654294268534100173925299601301255264109702369330740049011038119988752384 */
    tmpvar1.mul_assign(&tmpvar9); /*  458 : 6504961059244974661049697744797813750396716654294268534100173925299601301255264109702369330740049011038119988752401 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  459 : 104079376947919594576795163916765020006347466468708296545602782804793620820084225755237909291840784176609919820038416 */
    tmpvar1.mul_assign(&tmpvar5); /*  463 : 104079376947919594576795163916765020006347466468708296545602782804793620820084225755237909291840784176609919820038429 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  464 : 3330540062333427026457445245336480640203118926998665489459289049753395866242695224167613097338905093651517434241229728 */
    tmpvar1.mul_assign(&tmpvar5); /*  469 : 3330540062333427026457445245336480640203118926998665489459289049753395866242695224167613097338905093651517434241229741 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  470 : 213154563989339329693276495701534760972999611327914591325394499184217335439532494346727238229689925993697115791438703424 */
    tmpvar1.mul_assign(&tmpvar2); /*  476 : 213154563989339329693276495701534760972999611327914591325394499184217335439532494346727238229689925993697115791438703427 */
    for _ in 0..9 {
        tmpvar1.square();
    } /*  477 : 109135136762541736802957565799185797618175800999892270758601983582319275745040637105524345973601242108772923285216616154624 */
    tmpvar1.mul_assign(&tmpvar6); /*  486 : 109135136762541736802957565799185797618175800999892270758601983582319275745040637105524345973601242108772923285216616154649 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  487 : 3492324376401335577694642105573945523781625631996552664275263474634216823841300387376779071155239747480733545126931716948768 */
    tmpvar1.mul_assign(&tmpvar6); /*  492 : 3492324376401335577694642105573945523781625631996552664275263474634216823841300387376779071155239747480733545126931716948793 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  493 : 223508760089685476972457094756732513522024040447779370513616862376589876725843224792113860553935343838766946888123629884722752 */
    tmpvar1.mul_assign(&tmpvar2); /*  499 : 223508760089685476972457094756732513522024040447779370513616862376589876725843224792113860553935343838766946888123629884722755 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  500 : 14304560645739870526237254064430880865409538588657879712871479192101752110453966386695287075451862005681084600839912312622256320 */
    tmpvar1.mul_assign(&tmpvar2); /*  506 : 14304560645739870526237254064430880865409538588657879712871479192101752110453966386695287075451862005681084600839912312622256323 */
    for _ in 0..9 {
        tmpvar1.square();
    } /*  507 : 7323935050618813709433474080988611003089683757392834412990197346356097080552430789987986982631353346908715315630035104062595237376 */
    tmpvar1.mul_assign(&tmpvar7); /*  516 : 7323935050618813709433474080988611003089683757392834412990197346356097080552430789987986982631353346908715315630035104062595237399 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  517 : 937463686479208154807484682366542208395479520946282804862745260333580426310711141118462333776813228404315560400644493320012190387072 */
    tmpvar1.mul_assign(&tmpvar10); /*  524 : 937463686479208154807484682366542208395479520946282804862745260333580426310711141118462333776813228404315560400644493320012190387087 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  525 : 59997675934669321907679019671458701337310689340562099511215696661349147283885513031581589361716046617876195865641247572480780184773568 */
    tmpvar1.mul_assign(&tmpvar6); /*  531 : 59997675934669321907679019671458701337310689340562099511215696661349147283885513031581589361716046617876195865641247572480780184773593 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  532 : 1919925629909418301045728629486678442793942058897987184358902293163172713084336417010610859574913491772038267700519922319384965912754976 */
    tmpvar1.mul_assign(&tmpvar14); /*  537 : 1919925629909418301045728629486678442793942058897987184358902293163172713084336417010610859574913491772038267700519922319384965912754985 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  538 : 245750480628405542533853264574294840677624583538942359597939493524886107274795061377358190025588926946820898265666550056881275636832638080 */
    tmpvar1.mul_assign(&tmpvar7); /*  545 : 245750480628405542533853264574294840677624583538942359597939493524886107274795061377358190025588926946820898265666550056881275636832638103 */
    for _ in 0..2 {
        tmpvar1.square();
    } /*  546 : 983001922513622170135413058297179362710498334155769438391757974099544429099180245509432760102355707787283593062666200227525102547330552412 */
    tmpvar1.mul_assign(tmpvar0); /*  548 : 983001922513622170135413058297179362710498334155769438391757974099544429099180245509432760102355707787283593062666200227525102547330552413 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  549 : 251648492163487275554665742924077916853887573543876976228290041369483373849390142850414786586203061193544599824042547258246426252116621417728 */
    tmpvar1.mul_assign(&tmpvar13); /*  557 : 251648492163487275554665742924077916853887573543876976228290041369483373849390142850414786586203061193544599824042547258246426252116621417739 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  558 : 4026375874615796408874651886785246669662201176702031619652640661911733981590242285606636585379248979096713597184680756131942820033865942683824 */
    tmpvar1.mul_assign(&tmpvar15); /*  562 : 4026375874615796408874651886785246669662201176702031619652640661911733981590242285606636585379248979096713597184680756131942820033865942683829 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  563 : 515376111950821940335955441508511573716761750617860047315538004724701949643551012557649482928543869324379340439639136784888680964334840663530112 */
    tmpvar1.mul_assign(&tmpvar3); /*  570 : 515376111950821940335955441508511573716761750617860047315538004724701949643551012557649482928543869324379340439639136784888680964334840663530119 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  571 : 131936284659410416726004593026178962871491008158172172112777729209523699108749059214758267629707230547041111152547619016931502326869719209863710464 */
    tmpvar1.mul_assign(&tmpvar14); /*  579 : 131936284659410416726004593026178962871491008158172172112777729209523699108749059214758267629707230547041111152547619016931502326869719209863710473 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  580 : 16887844436404533340928587907350907247550849044246038030435549338819033485919879579489058256602525510021262227526095234167232297839324058862554940544 */
    tmpvar1.mul_assign(&tmpvar5); /*  587 : 16887844436404533340928587907350907247550849044246038030435549338819033485919879579489058256602525510021262227526095234167232297839324058862554940557 */
    for _ in 0..10 {
        tmpvar1.square();
    } /*  588 : 17293152702878242141110874017127329021492069421307942943166002522950690289581956689396795654760986122261772520986721519787245872987467836275256259130368 */
    tmpvar1.mul_assign(&tmpvar14); /*  598 : 17293152702878242141110874017127329021492069421307942943166002522950690289581956689396795654760986122261772520986721519787245872987467836275256259130377 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  599 : 1106761772984207497031095937096149057375492442963708348362624161468844178533245228121394921904703111824753441343150177266383735871197941521616400584344128 */
    tmpvar1.mul_assign(&tmpvar13); /*  605 : 1106761772984207497031095937096149057375492442963708348362624161468844178533245228121394921904703111824753441343150177266383735871197941521616400584344139 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  606 : 70832753470989279809990139974153539672031516349677334295207946334006027426127694599769275001900999156784220245961611345048559095756668257383449637398024896 */
    tmpvar1.mul_assign(&tmpvar5); /*  612 : 70832753470989279809990139974153539672031516349677334295207946334006027426127694599769275001900999156784220245961611345048559095756668257383449637398024909 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  613 : 4533296222143313907839368958345826539010017046379349394893308565376385755272172454385233600121663946034190095741543126083107782128426768472540776793473594176 */
    tmpvar1.mul_assign(&tmpvar11); /*  619 : 4533296222143313907839368958345826539010017046379349394893308565376385755272172454385233600121663946034190095741543126083107782128426768472540776793473594207 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  620 : 145065479108586045050859806667066449248320545484139180636585874092044344168709518540327475203893246273094083063729380034659449028109656591121304857391155014624 */
    tmpvar1.mul_assign(&tmpvar6); /*  625 : 145065479108586045050859806667066449248320545484139180636585874092044344168709518540327475203893246273094083063729380034659449028109656591121304857391155014649 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  626 : 18568381325899013766510055253384505503785029821969815121482991883781676053594818373161916826098335522956042632157360644436409475598036043663527021746067841875072 */
    tmpvar1.mul_assign(&tmpvar10); /*  633 : 18568381325899013766510055253384505503785029821969815121482991883781676053594818373161916826098335522956042632157360644436409475598036043663527021746067841875087 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  634 : 594188202428768440528321768108304176121120954303034083887455740281013633715034187941181338435146736734593364229035540621965103219137153397232864695874170940002784 */
    tmpvar1.mul_assign(&tmpvar5); /*  639 : 594188202428768440528321768108304176121120954303034083887455740281013633715034187941181338435146736734593364229035540621965103219137153397232864695874170940002797 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  640 : 76056089910882360387625186317862934543503482150788362737594334755969745115524376056471211319698782302027950621316549199611533212049555634845806681071893880320358016 */
    tmpvar1.mul_assign(&tmpvar11); /*  647 : 76056089910882360387625186317862934543503482150788362737594334755969745115524376056471211319698782302027950621316549199611533212049555634845806681071893880320358047 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  648 : 2433794877148235532404005962171613905392111428825227607603018712191031843696780033807078762230361033664894419882129574387569062785585780315065813794300604170251457504 */
    tmpvar1.mul_assign(&tmpvar3); /*  653 : 2433794877148235532404005962171613905392111428825227607603018712191031843696780033807078762230361033664894419882129574387569062785585780315065813794300604170251457511 */
    for _ in 0..8 {
        tmpvar1.square();
    } /*  654 : 623051488549948296295425526315933159780380525779258267546372790320904151986375688654612163130972424618212971489825171043217680073109959760656848331340954667584373122816 */
    tmpvar1.mul_assign(&tmpvar12); /*  662 : 623051488549948296295425526315933159780380525779258267546372790320904151986375688654612163130972424618212971489825171043217680073109959760656848331340954667584373122843 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  663 : 39875295267196690962907233684219722225944353649872529122967858580537865727128044073895178440382235175565630175348810946765931524679037424682038293205821098725399879861952 */
    tmpvar1.mul_assign(&tmpvar8); /*  669 : 39875295267196690962907233684219722225944353649872529122967858580537865727128044073895178440382235175565630175348810946765931524679037424682038293205821098725399879861981 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  670 : 2552018897100588221626062955790062222460438633591841863869942949154423406536194820729291420184463051236200331222323900593019617579458395179650450765172550318425592311166784 */
    tmpvar1.mul_assign(&tmpvar2); /*  676 : 2552018897100588221626062955790062222460438633591841863869942949154423406536194820729291420184463051236200331222323900593019617579458395179650450765172550318425592311166787 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  677 : 326658418828875292368136058341127964474936145099755758575352697491766196036632937053349301783611270558233642396457459275906511050170674582995257697942086440758475815829348736 */
    tmpvar1.mul_assign(&tmpvar13); /*  684 : 326658418828875292368136058341127964474936145099755758575352697491766196036632937053349301783611270558233642396457459275906511050170674582995257697942086440758475815829348747 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  685 : 41812277610096037423121415467664379452791826572768737097645145278946073092689015942828710628302242631453906226746554787316033414421846346623392985336587064417084904426156639616 */
    tmpvar1.mul_assign(&tmpvar13); /*  692 : 41812277610096037423121415467664379452791826572768737097645145278946073092689015942828710628302242631453906226746554787316033414421846346623392985336587064417084904426156639627 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  693 : 2675985767046146395079770589930520284978676900657199174249289297852548677932097020341037480211343528413049998511779506388226138522998166183897151061541572122693433883274024936128 */
    tmpvar1.mul_assign(&tmpvar2); /*  699 : 2675985767046146395079770589930520284978676900657199174249289297852548677932097020341037480211343528413049998511779506388226138522998166183897151061541572122693433883274024936131 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  700 : 85631544545476684642552658877776649119317660821030373575977257531281557693827104650913199366762992909217599952376944204423236432735941317884708833969330307926189884264768797956192 */
    tmpvar1.mul_assign(&tmpvar3); /*  705 : 85631544545476684642552658877776649119317660821030373575977257531281557693827104650913199366762992909217599952376944204423236432735941317884708833969330307926189884264768797956199 */
    for _ in 0..10 {
        tmpvar1.square();
    } /*  706 : 87686701614568125073973922690843288698181284680735102541800711712032315078478955162535116151565304739038822351233990865329394107121603909513941845984594235316418441487123249107147776 */
    tmpvar1.mul_assign(&tmpvar12); /*  716 : 87686701614568125073973922690843288698181284680735102541800711712032315078478955162535116151565304739038822351233990865329394107121603909513941845984594235316418441487123249107147803 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  717 : 1402987225833090001183582763053492619170900554891761640668811387392517041255663282600561858425044875824621157619743853845270305713945662552223069535753507765062695063793971985714364848 */
    tmpvar1.mul_assign(tmpvar0); /*  721 : 1402987225833090001183582763053492619170900554891761640668811387392517041255663282600561858425044875824621157619743853845270305713945662552223069535753507765062695063793971985714364849 */
    for _ in 0..9 {
        tmpvar1.square();
    } /*  722 : 718329459626542080605994374683388221015501084104581960022431430344968725122899600691487671513622976422206032701308853168778396525540179226738211602305795975712099872662513656685754802688 */
    tmpvar1.mul_assign(&tmpvar9); /*  731 : 718329459626542080605994374683388221015501084104581960022431430344968725122899600691487671513622976422206032701308853168778396525540179226738211602305795975712099872662513656685754802705 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  732 : 45973085416098693158783639979736846144992069382693245441435611542077998407865574444255210976871870491021186092883766602801817377634571470511245542547570942445574391850400874027888307373120 */
    tmpvar1.mul_assign(&tmpvar10); /*  738 : 45973085416098693158783639979736846144992069382693245441435611542077998407865574444255210976871870491021186092883766602801817377634571470511245542547570942445574391850400874027888307373135 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  739 : 5884554933260632724324305917406316306558984880984735416503758277385983796206793528864667005039599422850711819889122125158632624337225148225439429446089080633033522156851311875569703343761280 */
    tmpvar1.mul_assign(&tmpvar11); /*  746 : 5884554933260632724324305917406316306558984880984735416503758277385983796206793528864667005039599422850711819889122125158632624337225148225439429446089080633033522156851311875569703343761311 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  747 : 188305757864340247178377789357002121809887516191511533328120264876351481478617392923669344161267181531222778236451908005076243978791204743214061742274850580257072709019241980018230507000361952 */
    tmpvar1.mul_assign(&tmpvar4); /*  752 : 188305757864340247178377789357002121809887516191511533328120264876351481478617392923669344161267181531222778236451908005076243978791204743214061742274850580257072709019241980018230507000361973 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  753 : 3012892125829443954854044629712033948958200259064184533249924238021623703657878286778709506580274904499564451783230528081219903660659275891424987876397609284113163344307871680291688112005791568 */
    tmpvar1.mul_assign(&tmpvar10); /*  757 : 3012892125829443954854044629712033948958200259064184533249924238021623703657878286778709506580274904499564451783230528081219903660659275891424987876397609284113163344307871680291688112005791583 */
    for _ in 0..7 {
        tmpvar1.square();
    } /*  758 : 385650192106168826221317712603140345466649633160215620255990302466767834068208420707674816842275187775944249828253507594396147668564387314102398448178893988366484908071407575077336078336741322624 */
    tmpvar1.mul_assign(&tmpvar8); /*  765 : 385650192106168826221317712603140345466649633160215620255990302466767834068208420707674816842275187775944249828253507594396147668564387314102398448178893988366484908071407575077336078336741322653 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  766 : 12340806147397402439082166803300491054932788261126899848191689678936570690182669462645594138952806008830215994504112243020676725394060394051276750341724607627727517058285042402474754506775722324896 */
    tmpvar1.mul_assign(&tmpvar4); /*  771 : 12340806147397402439082166803300491054932788261126899848191689678936570690182669462645594138952806008830215994504112243020676725394060394051276750341724607627727517058285042402474754506775722324917 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  772 : 394905796716716878050629337705615713757849224356060795142134069725970262085845422804659012446489792282566911824131591776661655212609932609640856010935187444087280545865121356879192144216823114397344 */
    tmpvar1.mul_assign(&tmpvar4); /*  777 : 394905796716716878050629337705615713757849224356060795142134069725970262085845422804659012446489792282566911824131591776661655212609932609640856010935187444087280545865121356879192144216823114397365 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  778 : 12636985494934940097620138806579702840251175179393945444548290231231048386747053529749088398287673353042141178372210936853172966803517843508507392349925998210792977467683883420134148614938339660715680 */
    tmpvar1.mul_assign(&tmpvar9); /*  783 : 12636985494934940097620138806579702840251175179393945444548290231231048386747053529749088398287673353042141178372210936853172966803517843508507392349925998210792977467683883420134148614938339660715697 */
    for _ in 0..4 {
        tmpvar1.square();
    } /*  784 : 202191767918959041561922220905275245444018802870303127112772643699696774187952856475985414372602773648674258853955374989650767468856285496136118277598815971372687639482942134722146377839013434571451152 */
    tmpvar1.mul_assign(&tmpvar5); /*  788 : 202191767918959041561922220905275245444018802870303127112772643699696774187952856475985414372602773648674258853955374989650767468856285496136118277598815971372687639482942134722146377839013434571451165 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  789 : 12940273146813378659963022137937615708417203383699400135217449196780593548028982814463066519846577513515152566653143999337649118006802271752711569766324222167852008926908296622217368181696859812572874560 */
    tmpvar1.mul_assign(&tmpvar8); /*  795 : 12940273146813378659963022137937615708417203383699400135217449196780593548028982814463066519846577513515152566653143999337649118006802271752711569766324222167852008926908296622217368181696859812572874589 */
    tmpvar1.square(); /*  796 : 25880546293626757319926044275875231416834406767398800270434898393561187096057965628926133039693155027030305133306287998675298236013604543505423139532648444335704017853816593244434736363393719625145749178 */
    tmpvar1.mul_assign(tmpvar0); /*  797 : 25880546293626757319926044275875231416834406767398800270434898393561187096057965628926133039693155027030305133306287998675298236013604543505423139532648444335704017853816593244434736363393719625145749179 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  798 : 1656354962792112468475266833656014810677402033113523217307833497187915974147709800251272514540361921729939528531602431915219087104870690784347080930089500437485057142644261967643823127257198056009327947456 */
    tmpvar1.mul_assign(&tmpvar3); /*  804 : 1656354962792112468475266833656014810677402033113523217307833497187915974147709800251272514540361921729939528531602431915219087104870690784347080930089500437485057142644261967643823127257198056009327947463 */
    for _ in 0..10 {
        tmpvar1.square();
    } /*  805 : 1696107481899123167718673237663759166133659681908247774523221501120425957527254835457303054889330607851458077216360890281184345195387587363171410872411648447984698514067724254867274882311370809353551818202112 */
    tmpvar1.mul_assign(&tmpvar7); /*  815 : 1696107481899123167718673237663759166133659681908247774523221501120425957527254835457303054889330607851458077216360890281184345195387587363171410872411648447984698514067724254867274882311370809353551818202135 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  816 : 108550878841543882733995087210480586632554219642127857569486176071707261281744309469267395512917158902493316941847096977995798092504805591242970295834345500671020704900334352311505592467927731798627316364936640 */
    tmpvar1.mul_assign(&tmpvar4); /*  822 : 108550878841543882733995087210480586632554219642127857569486176071707261281744309469267395512917158902493316941847096977995798092504805591242970295834345500671020704900334352311505592467927731798627316364936661 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  823 : 6947256245858808494975685581470757544483470057096182884447115268589264722031635806033113312826698169759572284278214206591731077920307557839550098933398112042945325113621398547936357917947374835112148247355946304 */
    tmpvar1.mul_assign(&tmpvar6); /*  829 : 6947256245858808494975685581470757544483470057096182884447115268589264722031635806033113312826698169759572284278214206591731077920307557839550098933398112042945325113621398547936357917947374835112148247355946329 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  830 : 444624399734963743678443877214128482846942083654155704604615377189712942210024691586119252020908682864612626193805709221870788986899683701731206331737479170748500807271769507067926906748631989447177487830780565056 */
    tmpvar1.mul_assign(&tmpvar5); /*  836 : 444624399734963743678443877214128482846942083654155704604615377189712942210024691586119252020908682864612626193805709221870788986899683701731206331737479170748500807271769507067926906748631989447177487830780565069 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  837 : 28455961583037679595420408141704222902204293353865965094695384140141628301441580261511632129338155703335208076403565390199730495161579756910797205231198666927904051665393248452347322031912447324619359221169956164416 */
    tmpvar1.mul_assign(&tmpvar4); /*  843 : 28455961583037679595420408141704222902204293353865965094695384140141628301441580261511632129338155703335208076403565390199730495161579756910797205231198666927904051665393248452347322031912447324619359221169956164437 */
    for _ in 0..23 {
        tmpvar1.square();
    } /*  844 : 238705906983162543355580399100765177871214152862586865721082456961065184302499251714358569373223087638243353151383559860752580829556389241459968722180074986980751351032731127113348364375477010926880553717580063640645533696 */
    tmpvar1.mul_assign(&tmpvar3); /*  867 : 238705906983162543355580399100765177871214152862586865721082456961065184302499251714358569373223087638243353151383559860752580829556389241459968722180074986980751351032731127113348364375477010926880553717580063640645533703 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  868 : 15277178046922402774757145542448971383757705783205559406149277245508171795359952109718948439886277608847574601688547831088165173091608911453437998219524799166768086466094792135254295320030528699320355437925124073001314156992 */
    tmpvar1.mul_assign(&tmpvar3); /*  874 : 15277178046922402774757145542448971383757705783205559406149277245508171795359952109718948439886277608847574601688547831088165173091608911453437998219524799166768086466094792135254295320030528699320355437925124073001314156999 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  875 : 488869697501516888792228657358367084280246585062577900996776871856261497451518467511006350076360883483122387254033530594821285538931485166510015943024793573336578766915033348328137450240976918378251374013603970336042053023968 */
    tmpvar1.mul_assign(&tmpvar2); /*  880 : 488869697501516888792228657358367084280246585062577900996776871856261497451518467511006350076360883483122387254033530594821285538931485166510015943024793573336578766915033348328137450240976918378251374013603970336042053023971 */
    for _ in 0..6 {
        tmpvar1.square();
    } /*  881 : 31287660640097080882702634070935493393935781444004985663793719798800735836897181920704406404887096542919832784258145958068562274491615050656641020353586788693541041082562134293000796815422522776208087936870654101506691393534144 */
    tmpvar1.mul_assign(&tmpvar3); /*  887 : 31287660640097080882702634070935493393935781444004985663793719798800735836897181920704406404887096542919832784258145958068562274491615050656641020353586788693541041082562134293000796815422522776208087936870654101506691393534151 */
    for _ in 0..5 {
        tmpvar1.square();
    } /*  888 : 1001205140483106588246484290269935788605945006208159541241399033561623546780709821462541004956387089373434649096260670658193992783731681621012512651314777238193313314641988297376025498093520728838658813979860931248214124593092832 */
    tmpvar1.mul_assign(&tmpvar2); /*  893 : 1001205140483106588246484290269935788605945006208159541241399033561623546780709821462541004956387089373434649096260670658193992783731681621012512651314777238193313314641988297376025498093520728838658813979860931248214124593092835 */
}

/// Tests for addition chains
#[cfg(test)]
mod tests {
    use super::{chain_p2m9div16, chain_pm3div4};
    use bls12_381::{Fq, Fq2};
    use ff::Field;
    use rand_core::SeedableRng;
    #[test]
    fn test_fq_chain() {
        let mut rng = rand_xorshift::XorShiftRng::from_seed([
            0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06,
            0xbc, 0xe5,
        ]);
        let p_m3_over4 = [
            0xee7fbfffffffeaaau64,
            0x7aaffffac54ffffu64,
            0xd9cc34a83dac3d89u64,
            0xd91dd2e13ce144afu64,
            0x92c6e9ed90d2eb35u64,
            0x680447a8e5ff9a6u64,
        ];

        let mut result = Fq::zero();
        for _ in 0..32 {
            let mut input = Fq::random(&mut rng);
            chain_pm3div4(&mut result, &input);
            input = input.pow(&p_m3_over4);
            assert_eq!(input, result);
        }
    }

    #[test]
    fn test_fq2_chain() {
        let mut rng = rand_xorshift::XorShiftRng::from_seed([
            0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06,
            0xbc, 0xe5,
        ]);
        let p_sq_m9_over16 = [
            0xb26aa00001c718e3u64,
            0xd7ced6b1d76382eau64,
            0x3162c338362113cfu64,
            0x966bf91ed3e71b74u64,
            0xb292e85a87091a04u64,
            0x11d68619c86185c7u64,
            0xef53149330978ef0u64,
            0x50a62cfd16ddca6u64,
            0x466e59e49349e8bdu64,
            0x9e2dc90e50e7046bu64,
            0x74bd278eaa22f25eu64,
            0x2a437a4b8c35fcu64,
        ];

        let mut result = Fq2::zero();
        for _ in 0..32 {
            let mut input = Fq2::random(&mut rng);
            chain_p2m9div16(&mut result, &input);
            input = input.pow(&p_sq_m9_over16);
            assert_eq!(input, result);
        }
    }
}