C :实施模块化指数

C++: implementing Modular Exponentiation

本文关键字:模块化 指数      更新时间:2023-10-16

我正在使用此新的和改进的代码,以解决我遇到的这个问题。

我正在使用模块化指数来使用公式[a^k mod n]来获得我必须做的分配的答案,而我必须在两个步骤中进行编码。

第一 int k必须转换为二进制表示k由0和1的列表组成。其次,必须进行模块化指数使用anK[]作为参数..

之前,我的代码不正确,并且能够纠正它。

我现在遇到的问题是,当我用Google Google Google在线计算器进行5^3 % 13的模块化启动器时,它应该== 8

我从代码中获得的结果是5。我试图了解我是否缺少该代码中的未成年人,还是我的数学错误是错误的?谢谢

#include <iostream>
#include <vector>
using namespace std;
vector <int> BinaryK(int k);
int ModularExpo(int a, vector <int> & k, int n);
int main()
{
    int a = 0;
    int k = 0;
    int n = 0;
    cout << "a^k % n" << endl;
    cout << "a = ";
    cin >> a;
    cout << "k = ";
    cin >> k;
    cout << "n = ";
    cin >> n;
    vector<int> B = BinaryK(k);
    int result = ModularExpo(a, B, n);
    cout << "a ^ k mod n == " << result << endl;
    return 0;
}
// c == b^e % m
vector<int> BinaryK(int k)
{
    vector<int> K; //hint: make K a vector
    int tmp = k;
    while (tmp > 0)
    {
        K.push_back(tmp % 2); //hint: use pushback
        tmp = tmp / 2;
    }
    return K;
}
int ModularExpo(int a, vector<int> & K, int n)
{
    if (n == 1)
        return 0;
    int b = 1;
    if (K.size() == 0)
        return b;
    int A = a;
    if (K[0] == 1)
        b = a;
    for (int i = 1; i < K.size() - 1; i++)
    {
        A = A * A % n;
        if (K[i] == 1)
            b = A*b % n;
    }
    return (b);
}

更改此一行:

    for (int i = 1; i < K.size(); i++)   // K.size() not K.size()-1