信息安全数学基础(二):欧拉函数

这篇博客将复习欧拉函数的定义及性质,然后给出三个关于欧拉函数的重要定理,最后介绍一种加速平方运算的方法(模重复平方计算法)

一.欧拉函数的性质

定理:设m1,m2是互素的两个正整数,如果k1,k2分别遍历模m1和模m2的简化剩余系,则
m2k1+m1k2遍历模m1,m2的简化剩余系

所以对于欧拉函数:
设m,n是互素的两个正整数,则f(m * n)=f(m)*f(n)
欧拉函数值的计算:
f(m)=m * Π (1-1/pk)
对于素数的幂次,其实就是f(pn)=pn-pn-1

二.欧拉定理

设m是大于1的整数,如果a是满足(a,m)=1的整数,则
af(m)=1 (mod m)
这个定理被应用在RSA加密中,还可以用来求a的逆元等。

三.费马小定理

设p是一个素数,则对任意整数a,有ap=a (mod p)
证明分类讨论(a,p)=1和a=n*p的情形即可

四.Wilson定理

设p是一个素数,则
(p-1)!= -1 (mod p)
证明是通过逆元的存在性,将2-p-2的数两两配对

五.模重复平方计算法

在介绍本节的方法前,想先分享一道智力题:
假设现在有1000瓶外表完全一样的水,其中有一瓶有毒,有十只小白鼠供你实验,小白鼠喝到毒后十分钟就会死亡,你会怎么样找到这瓶毒药?
这时候就有两种方法了:
1.将毒分成100组,十只小白鼠每组挨个试,最多需要1000分钟的时间
2.将毒分成100组后,始终将水一半一半的混合,按照折半查找的思想,只需要最多log(100)即70分钟即可找到毒
3.将水编号1-1000,按照二进制给十个瓶子里倒水,对应位为0时表示不倒,为1时表示倒,最后看哪几只老鼠死了就知道对应编号的水就是毒。这种方法只需要10分钟的时间。
没有读太多书的人可能只会想到方法1,一个初学程序员应该能想到方法2,而真正的程序员应该很快的想到方法3(因为210=1024≈1000)

这个故事告诉我们,巧用二进制的思想可以方便的解决一些问题,模重复平方法也正是用了二进制的表示思想。

在模算术计算中,常常涉及大整数模m和大整数n的计算:
bn( mod m)
如果你是程序员,你会怎么写这个函数?
1.递归的计算bn=(bn-1(mod m) * b) (mod m)
2.将n表示为二进制,对0对应的位置不计算,对1对应的位置i,将翻i倍的结果乘到ans中,这样最多仅需要计算2*(logn)次乘法,其实这就是模重复平方法了。非递归实现如下:
信息安全数学基础(二):欧拉函数_第1张图片

你可能感兴趣的:(本科学习)