平方求解欧拉
最近遇到一个根据欧拉数求解原数的例子,即已知Euler(Q)的值,求解Q,另已知Q=q^2,且q为质数。
欧拉函数性质
- 欧拉函数为积性函数。(对于数论函数 f(n) 不恒等于0,当 (m,n) = 1 时,满足 f(mn) = f(m)f(n) ,则称 f(n) 为积性函数) φ(mn) = φ(m)φ(n),(m,n) = 1
- 若 (m,n) = d,则φ(mn) = dφ(m)φ(n)/φ(d)
- 若m、n满足m|n,则φ(mn) = mφ(n)
- 若m、n满足m|n,则φ(m)|φ(n)
- 对于质数p,其欧拉函数公式为φ(p) = p-1
- 对于质数p,p^k的欧拉函数公式为φ(pk) = (p-1) · p^(k-1)
- 小于等于n且整除n的所有正整数的欧拉函数值之和等于n,即n = Σd|nφ(d)
- 欧拉定理:若(a,m) = 1,则 aφ(m) ≡ 1 (mod m)。
- 扩展欧拉定理
- ax ≡ ax mod φ(m) (mod m),(a,m) = 1
- 或ax ≡ ax (mod m),(a,m) ≠ 1且x < φ(m)
- 或 ax ≡ ax mod φ(m) + φ(m) (mod m),(a,m) ≠ 1且x ≥ φ(m)
求解一个数的欧拉函数
1 | import gmpy2 |
编写求解脚本
根据6可知,当k=2时,Euler(q x q)=q x (q-1);当已知Euler(Q)时,求解q就不难了。
1 | Euler(Q)+0.25=(q-0.5)^2; |
根据以上求解直接写出求解的python脚本
法一
考虑精度问题,没有使用math.sqrt,直接使用二分法求解平方根(即使输入不对,也会给出一个相近的结果);(无需安装第三方库,只能求解Euler(q^2)类型)
1 | x = int(input('input Euler(q*q):')) |
法二
直接利用sympy库进行解方程;pip install sympy
;(直接求解)
利用sympy求解方程时,需保证方程右边的结果为0,即任意方程E(x)=a,需变换成E(x)-a=0,写入sympy.solve中为方程左式即可。(可求解任意k>=2值类型)
1 | import sympy |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 0xchang's Blog!