C编程使用模幂运算来计算

时间:2013-09-10 22:58:39

标签: c recursion modulo exponentiation

我刚才有一个简单的问题来验证我的编程和数学是否正确。提前抱歉,如果这是偏离主题,我不在其他地方要求获得质量答案;)我怎样才能仔细检查答案是否正确?感谢

这是我的问题:

如果密码系统有2 ^ 48个可能的密钥,并且您有1000台计算机,每台计算机每秒可以测试500,000个加密密钥,在最坏的情况下,您可以在多少天内恢复正确的密钥,假设蛮力搜索,你可以在尝试解密时立即识别正确的密钥? (回想一下,一天有86,400秒。)

这是解决问题的程序输出:

Number of keys: 2^48
Number of computers: 1000
Number of keys/persecond: 500000
Number of days: 647168000

我的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int max_power(int base,int exp,int mod);
int main(void)
{
    int num_computers=1000;
    int keys_per_second= 500000;
    int seconds_in_day=86400;
    printf("Number of keys: 2^48\n");
    printf("Number of computers: %d\n",num_computers);
    printf("Number of keys/persecond: %d\n",keys_per_second);
    printf("Number of days: %d\n",max_power(2,48,seconds_in_day)*num_computers*keys_per_second);

    return 0;
}

int max_power(int base,int exp,int mod)
{
    if (exp == 0)
        return 1;
else if (exp%2 == 0) {
        int mysqrt = max_power(base, exp/2, mod);
        return (mysqrt*mysqrt)%mod;
    }
    else
        return (base*max_power(base, exp-1, mod))%mod;
}

最终代码(仍未完全满意,但我会问我的教授,如果在测试中这是可以接受的):

int main(void)
{
    double num_computers=1000;
    double keys_per_second= 500000;
    double seconds_in_day=86400;
    long double keys=pow(2.0,48);
    printf("Number of keys: %.0lf\n",keys);
    printf("Number of computers: %.0f\n",num_computers);
    printf("Number of keys/persecond: %.0f\n",keys_per_second);
    printf("============================================\n");
    printf("Time to decrypt all keys: %.2f days\n",keys/(num_computers*keys_per_second*seconds_in_day));

    return 0;
}

1 个答案:

答案 0 :(得分:1)

评论中指出了正确的计算方法。但是,你仍然不确定你是怎么出错的。

您在此处modular exponentiation的申请并不完全正确。模幂运算仅为z提供x的余数,你还需要