【问题标题】:C++: implementing Modular ExponentiationC++:实现模幂运算
【发布时间】:2017-07-28 13:08:24
【问题描述】:

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

我正在使用模幂运算来使用公式 [a^k mod n] 来获得我必须做的作业的答案,我需要分两步对其进行编码。

第一个int k 必须转换为二进制 表示 K 由 0 和 1 的列表组成。二、必须进行模幂运算 使用anK[] 作为参数..

之前我的代码不正确并且能够更正。

我现在面临的问题是,当我在网上搜索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);
}

【问题讨论】:

标签: c++


【解决方案1】:

改变这一行:

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

【讨论】:

  • 它没有改变任何东西,你能更具体吗?谢谢我不明白你的意思改变那条线但是用“-1”因为它不起作用
  • 退出条件应该是i &lt; K.size();,用当前代码(使用K.size()-1),最高位没有被使用。
猜你喜欢
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多