y^2 = x (mod p), 已知 x 和 p ,求 y 。

AboutMe 2003-08-07 05:07:39
数论问题,有人知道吗?

已知 p 为一质数,0<x<p ,0<y<p ,求 y^2 = x (mod p) 。
...全文
1029 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
AboutMe 2003-08-19
  • 打赏
  • 举报
回复
看来目前已没有较快的算法了,结贴吧。
另:我有一个关于椭圆曲线的帖子,请高手支招。
http://expert.csdn.net/Expert/TopicView1.asp?id=2161996
IT_worker 2003-08-13
  • 打赏
  • 举报
回复
对于2^380这么大的数执行速度具体有多块我不知道,不过我想只要大整数类的基本函数写的足够优化,应该能在P4上一秒中内酸出。
IT_worker 2003-08-12
  • 打赏
  • 举报
回复
我的算法思想源于下列事实:
如果存在奇数n使得 x^n = 1%p
那么x的平方根完全可以构造出来就是:y = x^((n+1)/2) % p (***)
因为y^2 = ( x^((n+1)/2) )^2 = x^(n+1) = x^n*x = 1*x = x (这里等号都是在对p求余的情况下)
不幸的是找出这样的n或许很难或许根本找不出来,幸好菲马小定理给了我们一些帮助因为任何x都满足x^(p-1) = 1%p,这就给我寻找n提供了一些线索,不过最后的分析发现根本就不需要找出那个n来。
仍然如我上文中所述,将p-1分解成a*b 令 t = (x^b)%p 那么一定有 t,t^2,t^4,……,t^a对p取模为1,取其次数最小者为c,如果c等于a那么不幸的很t没有平方根,附带x也没有,否则可求出k使得 k*b = -1 % c,令 y = x*t^k 那么可以发现
y^b = (x*t^k)^b = x^b*(t^(k*b)) = t*(t^(k*b)) = t^(k*b+1) = t^(c*某某) = 1 (这里等号都是在对p求余的情况下)
这样的y可以根据(***)求出其平方根y2
由于 y = x*t^k 很容易解出 x = y*t^(c-k)
这样我们只需求出t的平方根t2就能得出x的平方根
x2 = y2*t2(c-k)了。

看到这里或许你认为还是要求t=x^b的平方根,问题并没有简化。但事实上是:t必然是p的a个a次根中的一个,我们只需事先求处所有这a个a次根,并求出他们的平方根即可。这个工作我在上文中的最后一段给出了描述。
feathersky 2003-08-12
  • 打赏
  • 举报
回复
modify: so the total result number is about equal to p-sqrt(p)
feathersky 2003-08-12
  • 打赏
  • 举报
回复

y^2=x+np 0<x<p ,0<y<p
故 n in {0,1,2,p-1}
so just compute the square number in [p,p*p], they are p^2, (p-1)^2, (p-2)^2 ...
then u can get a list of square number

for square[i];
n= [square[i]/p] , x=square[i]-n*p;

they are all right result , so the total result number is equal to p, so the complexity is O(p), but p is so big, so if you want all result the complexity
must be this.
AboutMe 2003-08-12
  • 打赏
  • 举报
回复
我已经在网上找到一份源程序,基本上和 IT_worker 的算法一样,不过速度仍然不理想。
我再等几天,如果没有更好更快的算法的话,就结贴吧。
AboutMe 2003-08-12
  • 打赏
  • 举报
回复
To IT_worker:
你的回答我看不大明白,能否整理一下,给出清晰严谨有条理的叙述?谢谢!
HUNTON 2003-08-07
  • 打赏
  • 举报
回复
因为0<y<p ,所以最差的方法就是把y全搜索一遍了。就是:
int test(int x, int p)
{
int y;
if(x<=0 | x>=p) return -1;
for(y = 1;y < p;y++){
if((y*y) % p == x) return y;
}
return -1;
}
AboutMe 2003-08-07
  • 打赏
  • 举报
回复
请大家看清标题,现在的问题是,我别处已经给出 x 和 p 的值,要求解出 y 的值。
补充一点,我已说了是数论问题,即 x y p 均为整数。

给出算法即可。
有网站链接也行。
Riemann 2003-08-07
  • 打赏
  • 举报
回复
楼上的错了,x可以不必为完全平方数。例如:取p=7,显然x=2,y=3是它的一组解。
feathersky的是正解,只需再加上限制0<x<p及0<y<p即可。

HUNTON 2003-08-07
  • 打赏
  • 举报
回复
因为0<x<p ,0<y<p ,所以解集就是{(x,y) | x是完全平方数,y = sqrt(x),0<x<p}
feathersky 2003-08-07
  • 打赏
  • 举报
回复
y^2=x+np y=sqrt(x+np)
HUNTON 2003-08-07
  • 打赏
  • 举报
回复
这里有没有限制x、y是整数啊?反正(1,1)肯定是一组解了
zzwu 2003-08-07
  • 打赏
  • 举报
回复
因 0<x<p ,故y^2 = x (mod p) 即 y^2 = x , 所以 y=|sqrt(p)|就是一个解
IT_worker 2003-08-07
  • 打赏
  • 举报
回复
下面是我刚刚构造出来的一个求平方跟的算法,不知道能否满足你的要求。
记 p-1 = a*b 这里a是2的幂,b是奇数。由费马晓定理可知对任意x都有 x^(a*b)=1 % p。
首先我们希望求出所有满足x^a=1%p的数,事实上这样的x一共有a个并且他们分别为
1,q,q^2,q^3,……,q^(a-1)。首先我假定能够有某种快速算法得出这样的q。
有了q后我们可以证明对于任何的x一定存在某个i使得
(x*p^i)^b = 1 % p (求出这个i只需验证a次)
纪录 y = x*p^i, z = p^(a-i) 我们有 x = y*z %p
y的平方根我们很容易求得:sqrt(y) = y^( (b+1)/2 ) % p
如果i为奇数那么z没有平方根,当然x也没有平方根,否则sqrt(z) = p^((a-i)/2)
sqrt(y)*sqrt(z)就是我们需要的sqrt(x)

在上面的算法中将x分解成y*z需要不超过a次的验证,而sqrt(y)和sqrt(z)的求法都是直接的公式。如果我们事先能够求出p的q那么整个算法的复杂度是可以接受的。求q的算法我个人认为也不会化去太多的时间,对任何数x它要能成为我们的p需要满足x^2,x^4,……,x^(a/2)都不对p取模为1,这样我们可以从2开始将它们的b次方带入上述条件,如果满足则我们就找到了我们所需的q
IT_worker 2003-08-07
  • 打赏
  • 举报
回复
判断y是否存在我倒是知道可以使用高斯的二次互反率,真要是把y求出来就不知道了。
关注中……!
HUNTON 2003-08-07
  • 打赏
  • 举报
回复
错了应该是if(x<=0 || x>=p) return -1;
其实,这就是平方剩余码的内容了。平方剩余码也称QR码,是一类重要的循环码。

定义:若对某一素数p,存在有一个整数x,使x^2 == i(mod p)成立,则称i是模p的平方剩余;否则称i是模p的非平方剩余。

定理:若p是奇素数,则在1至p-1中的所有整数中,有(p-1)/2个模p的平方剩余,有(p-1)/2个模p的非平方剩余。

模p的平方剩余还有以下的性质:
(1)两个平方剩余的积或是两个非平方剩余的积仍是平方剩余。
一个平方剩余与非平方剩余的积为非平方剩余。
(2)若p=8m+1或8m-1,则2是模p的平方剩余,
若p=4m+1,则p-1是模p的平方剩余,
若p=4m-1,则p-1是模p的非平方剩余
AboutMe 2003-08-07
  • 打赏
  • 举报
回复
回楼上:
穷举法是行不通的,因为 p 是一个很大很大的数(约等于 2^384)。
我需要一个快速算法。

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧