2011-08-29 25 views

回答

2

您可能需要爲使用gmpbcmath。這些是爲處理大量數字和計算而設計的php庫。

+0

** gmp **是偉大的,但我需要用我的手寫代碼,所以我'm尋找algorythm(: – ted

+0

我已經把算法,你可能想看看。 – Tarik

2

算法

要說b是一個模塊化的逆模m是說

A * B = 1(mod M)表示

爲任何整數,有存在這樣的倒數b當且僅當a和b是相對的質數。使用擴展的歐幾里得算法,我們可以找到一個x和y,使得a * x + m * y = 1。從中可以明顯看出a * x = 1(mod m),因此x是a的模逆。

代碼

我知道你想要PHP內,但我有C++版本也許你可以把它轉換成PHP以後。

int x = px; 
int y = py; 

//Setup initial variables 
//Maintain throughout that ax * px + bx * py = x and that ay * px + by * py = y 
int ax = 1; 
int ay = 0; 
int bx = 0; 
int by = 1; 

//Perform extended gcd 
while(x) 
{ 
    if(x <= y) 
    { 
     int m = y/x; 
     y -= m * x; 
     ay -= ax * m; 
     by -= bx * m; 
    } 
    else 
    { 
     swap(x, y); 
     swap(ax, ay); 
     swap(bx, by); 
    } 
} 

//you can assert that ay * px + by * py = y = gcd(px, py) 
//you can assert that ax * px + bx * py = x = 0 

//If we're taking the modular inverse of px (mod py), then for it to exist gcd(px, py) = 1 
//If it does exist, it is given by ay (mod py) 
int inverse = ay % py; 
if(inverse < 0) inverse += py; 
+0

+1爲模塊化逆解決方案。希望有人會提出一些關於如何實現乘法,除法和模數的建議,以及泰德尋求的擴展精度。 –

+0

@Braveyard,感謝「模塊乘法逆」的解釋,我知道它是如何工作的問題是使它與'數組編號' – ted