模運算問題: b/a^x(mod p) 能不能變形為(b(mod p) ) / (a^x(mod p) ) (mod p)


ElGamal加密算法說明:
      選擇素數p,兩個隨即數g,x. g,x<p.
      計算: y=g^x(mod p)

      加密: a=g^k(mod p) 
            b=g^k M(mod p)

      解密: M=b/a^x(mod p)
 
   !!!首先    M=b/a^x(mod p) 
 可不可以變形為:  M= (b(mod p) ) / (a^x(mod p) ) (mod p)
      a^x可能會得到一個很大的數,所以...
      你是數學系的一定能告訴我, 模運算除法是否可分配,可結合.

10 个解决方案

#1


不可以這樣變形吧,舉幾個特例驗證一下就知道了。

#2


模取冪運算。我以前也貼過的,可惜現在7月1號前的都搜不到了。那個海量科技也不知道能搜什么東西,什么都搜不到。只好再貼一次啰。

模取冪運算

事實上,m^e mod n可以直接計算,沒有必要先算m^e,那樣肯定不行。
m^e mod n叫做模取冪運算,根據簡單的數論知識,很容易設計一個分治算法。具體如下:

設<b[k], b[k-1],...,b[1],b[0]>是整數b的二進制表示(即b的二進制有k+1位,b[k]是最
高位),下列過程隨着c的值從0到b成倍增加,最終計算出a^c mod n

Modular-Exponentiation(a, b, n)
1.  c ← 0
2.  d ← 1
3.  設<b[k],b[k-1],..b[0]>是b的二進制表示
4.  for i←k downto 0
5.    do c ← 2c
6.       d ← (d*d) mod n
7.       if b[i] = 1 
8.         then c ← c + 1
9.              d ← (d*a) mod n
10. return d

首先說明一下,上述偽代碼中用縮緊表示語句之間的層次關系,例如第5~9行都是for循環體
內的語句,第8~9行都是then里面的語句。這是我比較喜歡的一種表示方法 ;)

上述偽代碼依次計算出的每個冪或者是前一個冪的兩倍,或者比前一個冪大1。過程依次從
右到左逐個讀入b的二進制表示已控制執行哪一種操作。循環中的每次迭代都用到了下面的
兩個恆等式中的一個:
a^(2c) mod n  = (a^c mod n)^2
a^(2c+1) mod n = a * (a^c mod n)^2
用哪一個恆等式取決於b[i]=0還是1。由於平方在每次迭代中起着關鍵作用,所以這種方法
叫做“反復平方法(repeated squaring)”。在讀入b[i]位並進行相應處理后,c的值與b的
二進制表示<b[k],b[k-1],..b[0]>的前綴的值相同。事實上,算法中並不真正需要變量c,
只是為了說明算法才設置了變量c:當c成倍增加時,算法保持條件d = a^c mod n 不變,直
至c=b。

如果輸入a,b,n是k位的數,則算法總共需要執行的算術運算次數為O(k),總共需要執行的位
操作次數為O(k^3)。

#3


就是那個冪模運算,那個Rabin-Miller里會用到,我寫成如下函數。
/*
冪模運算,返回值 x=base^pow mod n
*/
unsigned __int64 PowMod(unsigned __int64 base, unsigned __int64 pow, unsigned __int64 n)
{
    unsigned __int64    a=base, b=pow, c=1;
    while(b)
    {
        while(!(b & 1))
        {
            b>>=1;
            a=a * a % n;
        }

        b--;
        c=a * c % n;
    }

    return c;
}
但是發現還是有溢出的情況,就是那個a*a和a*c,不知道怎么處理。

#4


Sorry,是模冪運算。

#5


b/a^x(mod p) -> b/(a^x(mod p))  對不對???

#6


b/a^x(mod p) ==>  (b/a^x)(mod p)
             ==>  (b(mod p)) / ((a^x)(mod p))
對不對?

#7


(b(mod p)) / ((a^x)(mod p))
?????
誰是數學系的(學過數論)

#8


上面的問題實質是
a=x mod p
b=y mod p  (這里mod表示同余關系)
則b/a=y/x mod p
因為如果b/a=u mod p
即au=b mod p
由a,x;b,y的同余關系,可以設a=x+mp,b=y+np
於是(x+mp)u=y+np mod p
    xu=y+np-mup mod p
      =y mod p
因此y/x=u mod p
同理如果y/x=u mod p
也有b/a=u mod p

因此如果a與x同余,b與y同余,則b/a與y/x同余

#9


我覺得求M=b/a^x(mod p)的含義並不是要計算b/a^x吧,它的意思應該是求M使得
(M * a ^ x) mod p = b mod p
從這個式子可以推出:
(M * (a ^ x) mod p) mod p = b mod p
這樣就可以先求出c = a ^ x mod p來,再求c的逆元c^-1(mod p),最后乘以b就應該可以了。

#10


c=b/a mod p的意思就是
c*a=b mod p
也就是
c=((a^-1)modp *b) modp

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



sdut 2605 A^X mod P SDUT 2605 A^X mod P sdutoj 2605 A^X mod P X^2 Mod P------暴力 UPC 2219: A^X mod P 解一類x^a = b (mod p)的方程 【51nod 1038】X^A Mod P 51Nod-1014-X^2 Mod P 51Nod--1014 X^2 Mod P 51nod-【1014 X^2 Mod P】
 
粤ICP备14056181号  © 2014-2021 ITdaan.com