1. 程式人生 > 其它 >A note on the calculation of some functions in finite fields: Tricks of the Trade解讀

A note on the calculation of some functions in finite fields: Tricks of the Trade解讀

本節對該paper進行解讀,記錄筆記。

經常見到的是在素域\(F_p\)上計算的,尤其是雙線性對出現後,在擴域\(F_{p^m}\)上計效率就需要優化了。該論文主要總結了一些在有限域上進行某些計算(求模逆,hash到curve的轉換演算法,求模平方根等)的技巧。

素域

模冪(modular exponentiation)

模冪運算則是指先進行冪運算,在進行模運算,即\(X^N(mod p)\)

這樣對於較小的\(N\),一般這樣計算:

方法1

(1)根據運算規則\(ab(mod p)=((a mod p)b) mod p\) ,我們知道\(3333^{5555}(mod10)= 3^{5555}(mod10)\)

。由於\(3^4 = 81\),所以\(3^4(mod10)= 1\)
(2)根據運算規則\((a*b)modp=(amodp*bmodp)modp\),由於\(5555 = 4 * 1388 + 3\),我們得到

\[3^{5555}(mod10)=(3^{(4*1388)} * 3^3)(mod10)=((3^{(4*1388)}(mod10)* 3^3(mod10))(mod10)=(1 * 7)(mod10)= 7 \]

計算完畢。
  利用這些規則我們可以有效地計算\(X^N(mod P)\)。簡單的演算法是將result初始化為1,然後重複將result乘以X,每次乘法之後應用mod運算子(這樣使得result的值變小,以免溢位),執行N次相乘後,result就是我們要找的答案。

當N的值很大時,上面的方法需要計算很長時間,是不切實際的,一般用一下方法:

方法2

(1)如果N是偶數,那麼\(X^N =(X*X)^{[N/2]}\)
(2)如果N是奇數,那麼\(X^N = X*X^{(N-1)} = X *(X*X)^{[N/2]}\)
其中\([N]\)是指小於或等於\(N\)的最大整數。

(3)程式

// 函式功能:利用模運算規則,採用遞迴方式,計算X^N(% P)
// 函式名:PowerMod
// 輸入值:unsigned int x,底數x
// unsigned int n,指數n
// unsigned int p,模p
// 返回值:unsigned int,X^N(% P)的結果
unsigned int PowerMod(unsigned int x, unsigned int n, unsigned int p)
{
    if (n ==0)
    {
        return1;
    }
    unsigned int temp = PowerMod((x * x)%p, n/2, p); //遞迴計算(X*X)^[N/2]
    if ((n &1) !=0) //判斷n的奇偶性
    {
        temp = (temp * x) % p;
    }
    return temp;
}

求模逆(Modular inversion)

意思是:對於\(ax+bp=gcd(x,p)=1\),給出\(x,p\),求\(a,b\)。簡單點說,就是在模\(p\)下,求\(x\)的乘法逆元\(a\)

給出三種方法

方法1:擴充套件歐幾里得( extended Euclidean algorithm)

參考:求逆元
該方法的複雜度為\(O(m^2)\),其中\(m\)\(p\)的bit數。

方法2:費馬小定理( Fermat’s Little Theorem)

\(a=x^{p-2}(mod p)\)
具體請參考:求逆元
該方法基於模冪運算,複雜度為\(O(m^3)\),可以在確定時間內完成。
速度慢,更簡單,更安全!

方法3

\(ax=1(mod p)\),即\(a=1/x(mod p)\)
該方法速度很快,但很難在確定時間內完成。

使用技巧

比如要分別求\(1/x(mod p)\)\(1/y(mod p)\),可以將求兩個模逆轉換為求一個模逆,即求\(1/xy(mod p)\),對於\(y/xy(mod p)\)\(x/xy(mod p)\)

二次剩餘(Quadratic residuosity)

也叫做“平方剩餘”,是一個數學概念,具體指:

Legendre symbol

模平方根(Modular square roots)

就是如何計算二次剩餘中的平方根\(x\)
使用Tonelli-Shanks方法計算:

\[x=a^{(p-2^e-1)/2^{e+1}}mod p \]

其中\(2^e | (p-1)\)

可逆平方根(inverse square root)

即計算開方的倒數計算:\((\sqrt{x})^{-1}(mod p)\)

應用

點的壓縮(Point Decompression)

Hash to Curve

擴域