Annotation of coherent/d/usr/lib/libmp/pow.c, revision 1.1

1.1     ! root        1: #include "mprec.h"
        !             2: 
        !             3: 
        !             4: /*
        !             5:  *     Pow sets the mint pointed to by "c" to the mint pointed to by "a"
        !             6:  *     raised to the mint pointed to by "b" power reduced modulo the
        !             7:  *     mint pointed to by "m".  If "b" is negative then
        !             8:  *     mperr is called with the appropriate error message.
        !             9:  *     Note that no assumption is made as to the distinctness of "a", "b",
        !            10:  *     "m" and "c".
        !            11:  */
        !            12: 
        !            13: void
        !            14: pow(a, b, m, c)
        !            15: mint *a, *b, *c;
        !            16: register mint *m;
        !            17: {
        !            18:        mint    al, bl, cl, quot;
        !            19:        int rem;
        !            20: 
        !            21:        if (!ispos(b))
        !            22:                mperr("negative power");
        !            23: 
        !            24:        /* make local copies of a (reduced mod m) and b */
        !            25:        minit(&al);
        !            26:        minit(&quot);
        !            27:        mdiv(a, m, &quot, &al);
        !            28:        minit(&bl);
        !            29:        mcopy(b, &bl);
        !            30: 
        !            31:        /* form actual power */
        !            32:        minit(&cl);
        !            33:        sdiv(&bl, 2, &bl, &rem);
        !            34:        if (rem != 0)
        !            35:                mcopy(&al, &cl);
        !            36:        else
        !            37:                mcopy(mone, &cl);
        !            38:        while (!zerop(&bl)) {
        !            39:                mult(&al, &al, &al);
        !            40:                mdiv(&al, m, &quot, &al);
        !            41:                sdiv(&bl, 2, &bl, &rem);
        !            42:                if (rem != 0) {
        !            43:                        mult(&cl, &al, &cl);
        !            44:                        mdiv(&cl, m, &quot, &cl);
        !            45:                }
        !            46:        }
        !            47: 
        !            48:        /* clean up garbage */
        !            49:        mpfree(al.val);
        !            50:        mpfree(bl.val);
        !            51:        mintfr(quot.val);
        !            52:        *c = cl;
        !            53: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.