Как вы по модулю 128 битных стоек в с? - PullRequest
0 голосов
/ 19 июня 2019

У меня есть структура c

typedef struct u128b {
    uint64_t hi, 
    uint64_t lo
} u128b

Как бы я выполнил выражение по модулю x ^ e mod m, когда все 3 переменные, x, ė и m все являются структурами u128b?

Я пытался запустить код из https://stackoverflow.com/a/20114154/11667622

u128b mul_mod(u128b a, u128b b, u128b m)
{
    if (m == 0)
        return a * b;

    u128b r = {0, 0};

    while(a > 0)
    {
        if (a & 1)
            if ((r += b) > m) r %= m;
        a >>= 1;
        if ((b <<= 1) > m) b %= m;
    }
    return r;
}

//https://stackoverflow.com/questions/20111827/various-questions-about-rsa-encryption/20114154#20114154
u128b pow_mod(u128b base, u128b expon, u128b mod)
{
    u128b remainder = {0, 1};

    while (expon > 0) {
        if (expon & 1)
            remainder = mul_mod(r, base, mod);
        base = mul_mod(base, base, mod);
        expon >>= 1;
    }
    return remainder;
}

Это работает, когда все параметры и переменные равны uint64_t, но как мне применить это к двум отдельным 64-битным переменным hi и low для всех 3 переменных? сдвигая биты через привет и вот? и как будет работать модуль по битам hi и lo?

...