二次剩余的判定及Cipolla算法

本文探讨了如何在模p的条件下判断二次剩余问题,介绍了Cipolla算法,该算法在域Fp2上进行运算,复杂度为O(log2p),并提供了算法的证明和实现模板。
摘要由CSDN通过智能技术生成

二次剩余

p p p是奇素数。所有的运算都是在群 Z p ∗ Z_{p}^{*} Zp中的运算。方程 x 2 = a ≠ 0 x^2=a \neq 0 x2=a̸=0问是否有解,以及解是什么?若有解, a a a就是模 p p p的二次剩余;若无解,则 a a a就是模 p p p的非二次剩余。

  1. a = 0 a=0 a=0,显然只有唯一解 x = 0 x=0 x=0.

  2. a ≠ 0 a\neq 0 a̸=0,有解等价于 a p − 1 2 = 1 a^{\frac{p-1}{2}}=1 a2p1=1;无解等价于 a p − 1 2 = − 1 a^{\frac{p-1}{2}}=-1 a2p1=1.

Z p ∗ Z_{p}^{*} Zp恰好有一半的元素是二次剩余,一半的元素不是二次剩余。当元素 a a a是二次剩余是,解有且只有两个 x 0 , x 1 x_0,x_1 x0,x1,且 x 0 = − x 1 x_0=-x_1 x0=x1,即解 x = ± c x=\pm c x=±c

因此,验证 a a a是否是二次剩余可以用快速模幂,复杂度 O ( log ⁡ 2 p ) O(\log_2{p}) O(log2p).

对于二次剩余 a a a,求解x使用[Cipolla]{.underline}(洋葱? 奇波拉?)算法。

Cipolla(洋葱?)算法

这是一个随机性算法,复杂度是 O ( log ⁡ 2 p ) O(\log_2{p}) O(log2p)

这个算法是在域 F p 2 F_{p^2} Fp2上进行运算的,在这个域上做乘法、幂运算,然后解的那个表达式算出来之后,一定是属于域 F p F_{p} Fp的, F p 2 F_{p^2} Fp2 F p F_{p} Fp的扩充。

  1. 使用随机的方法,找到一个满足 b b b满足 b 2 − a b^2-a b2a不是二次剩余。需要检验 b 2 − a b^2-a b2a是不是二次剩余的期望次数是 2 2 2.每次检验是 O (

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值