簡體   English   中英

為什么 function 在數字大於 48 位的情況下會失敗?

[英]Why the function is failing in case of numbers greater than 48 digits?

我試圖找到

(a^b) % 模式

其中 b 和 mod 最大為 10^9,而 l 可能非常大,我已經使用這種關系成功測試了多達 48 位數字

(a^b) % mod = (a%mod)^b % mod

#define ll long long int
ll powerLL(ll x, ll n,ll MOD)
        {

        ll result = 1;
   

 while (n) {
        if (n & 1)
            result = result * x % MOD;
        n = n / 2;
        x = x * x % MOD;
    }
    return result;
}


ll powerStrings(string sa, string sb,ll MOD)
{


    ll a = 0, b = 0;


    for (size_t i = 0; i < sa.length(); i++)
        a = (a * 10 + (sa[i] - '0')) % MOD;

    for (size_t i = 0; i < sb.length(); i++)
        b = (b * 10 + (sb[i] - '0')) % (MOD - 1);

    return powerLL(a, b,MOD);
}

powerStrings("5109109785634228366587086207094636370893763284000","362323789",354252525) 返回208624800但它應該返回323419500 在這種情況下 a 是 49 位

powerStrings("300510498717329829809207642824818434714870652000","362323489",354255221) 返回282740484 ,這是正確的。 在這種情況下,a 是 48 位數字

代碼有問題還是我將不得不使用其他方法來做同樣的事情?

它不起作用,因為它在數學上不正確。

一般來說,我們有pow(a, n, m) = pow(a, n % λ(m), m)a m互質)其中λCarmichael function 作為一種特殊情況,當m是素數時,則λ(m) = m - 1 費馬小定理也涵蓋了這種情況。 這只是一種特殊情況,它並不總是有效。

λ(354252525) = 2146980 ,如果我破解它,那么正確的結果就會出來。 (雖然基數實際上並不與模數互質)

一般來說,您需要計算 Carmichael function 的模數,這並不重要,但對於小模數是可行的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM