网易首页 > 网易号 > 正文 申请入驻

2023-12-02:用go语言,如何求模立方根? x^3=a mod p, p是大于

0
分享至

2023-12-02:用go语言,如何求模立方根?

x^3=a mod p,

p是大于等于3的大质数,

a是1到p-1范围的整数常数,

x也是1到p-1范围的整数,求x。

p过大,x不能从1到p-1遍历。

答案2023-12-02:

灵捷3.5

大体步骤如下:

1.判断是否存在模立方根。有0,1,3个根这三种情况。

1.1.求p-1和3的最大公约数gcd(p-1,3)。最后结果要么是1,要么是3。如果是1,那肯定模立方根,但只有1个根。如果是3,进行下一步。

1.2.欧拉判别法。a**[(p-1)/3]==1 mod p。如果等于1,那就有3个根。如果不等于1,那就是0个根。

2.Peralta算法。求y。

2.1.当只有0个根时,直接返回。

2.2.当只有1个根时,a ^ ((p-1)/3) mod p就是答案。

2.3.当有3个根时,这个很难描述,具体见代码。

2.3.1.定义复数乘法和复数的快速幂。这虽然叫复数,但跟传统意义上的复数是不一样的。

2.3.2.确定一个常数r(r>=1并且r

2.3.3.确定一个复数根,对这个复数根作复数的快速幂运算,指数是(p^2+p+1)/3,最终结果就是需要的根。

时间复杂度为 O((log p)^3)。

额外空间复杂度为 O(1)。

go完整代码如下:

packagemain
import(
"fmt"
"math/big"
)
funcmain(){
iftrue{
iffalse{
p:=big.NewInt(0)
p.SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",16)
forc:=big.NewInt(20000);c.Cmp(big.NewInt(30000))<=0;c.Add(c,big.NewInt(1)){
fmt.Println("c=",c,"-------------")
r:=ModCbrt(c,p)
fmt.Println("答案:",r)
fori:=0;iifbig.NewInt(0).Exp(r[i],big.NewInt(3),p).Cmp(c)==0{
}else{
fmt.Println("答案错误",r[i],",c=",big.NewInt(0).Exp(r[i],big.NewInt(3),p))
return
}
}
}
return
}
iftrue{
p:=big.NewInt(0)
p.SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",16)
forc:=big.NewInt(20000);c.Cmp(big.NewInt(30000))<=0;c.Add(c,big.NewInt(1)){
fmt.Println("c=",c,"-------------")
r:=ModCbrt(c,p)
fmt.Println("答案:",r)
fori:=0;iifbig.NewInt(0).Exp(r[i],big.NewInt(3),p).Cmp(c)==0{
}else{
fmt.Println("答案错误",r[i],",c=",big.NewInt(0).Exp(r[i],big.NewInt(3),p))
return
}
}
}
return
}
iftrue{
p:=big.NewInt(997)
forc:=big.NewInt(1);c.Cmp(big.NewInt(0).Add(p,big.NewInt(-1)))<=0;c.Add(c,big.NewInt(1)){
fmt.Println("c=",c,"-------------")
r:=ModCbrt(c,p)
fmt.Println("答案:",r)
fori:=0;iifbig.NewInt(0).Exp(r[i],big.NewInt(3),p).Cmp(c)==0{
}else{
fmt.Println("答案错误",r[i],",c=",big.NewInt(0).Exp(r[i],big.NewInt(3),p))
return
}
}
}
}
return
}
fmt.Println("")
}
//求模立方根的个数0,1,3
funcModCbrtCount(c,p*big.Int)int{
t:=big.NewInt(0)
t.Add(p,big.NewInt(-2))
t.Mod(t,big.NewInt(3))
ift.Cmp(big.NewInt(0))==0{
return1
}
t=big.NewInt(0).Add(p,big.NewInt(-1))
t.Div(t,big.NewInt(3))
ifbig.NewInt(0).Exp(c,t,p).Cmp(big.NewInt(1))==0{
return3
}else{
return0
}
}
//PeraltaMethod
funcModCbrt(a,p*big.Int)(ans[]*big.Int){
ans=make([]*big.Int,0)
count:=ModCbrtCount(a,p)
ifcount==1{//有1个解
t:=big.NewInt(0).Lsh(p,1)
t.Mod(t,p)
t=t.Add(t,big.NewInt(-1))
t.Mod(t,p)
t.Mul(t,big.NewInt(0).ModInverse(big.NewInt(3),p))
t.Mod(t,p)
ans=append(ans,big.NewInt(0).Exp(a,t,p))
}elseifcount==3{//有3个解,PeraltaMethod算法
w:=big.NewInt(0)
p3:=big.NewInt(0).Add(p,big.NewInt(-1))//(p-1)/3
p3.Mul(p3,big.NewInt(0).ModInverse(big.NewInt(3),p))
p3.Mod(p3,p)
fori:=big.NewInt(1);i.Cmp(p)<0;i.Add(i,big.NewInt(1)){
w.Exp(i,p3,p)
ifw.Cmp(big.NewInt(1))!=0{
break
}
}
varx*big.Int
key:=big.NewInt(0)
forx=big.NewInt(1);x.Cmp(p)<0;x.Add(x,big.NewInt(1)){
key.Exp(x,big.NewInt(3),p)//key=x^3-a
key.Add(key,big.NewInt(0).Neg(a))
key.Mod(key,p)
ifkey.Cmp(big.NewInt(0))!=0&&ModCbrtCount(key,p)==0{
break
}
}
r:=Ring{x,big.NewInt(0).Add(p,big.NewInt(-1)),big.NewInt(0),key}
pp:=big.NewInt(0).Mul(p,p)//pp=(p*p+p+1)/3,注意pp是不能modp的,有点反直觉
pp.Add(pp,p)
pp.Add(pp,big.NewInt(1))
pp.Div(pp,big.NewInt(3))
ansr:=powerModI(r,pp,p)
ans0:=ansr.a
ans1:=big.NewInt(0)
ans1.Mul(ans0,w)
ans1.Mod(ans1,p)
ans2:=big.NewInt(0)
ans2.Mul(ans1,w)
ans2.Mod(ans2,p)
ans=append(ans,ans0,ans1,ans2)
}
return
}
typeRingstruct{
a*big.Int
b*big.Int
c*big.Int
w*big.Int
}
//复数乘法
funcmulI(xRing,yRing,p*big.Int)Ring{
varresRing
res.a=big.NewInt(0)
res.b=big.NewInt(0)
res.c=big.NewInt(0)
res.w=x.w
w:=x.w
a1:=big.NewInt(0)
a2:=big.NewInt(0)
a3:=big.NewInt(0)
a1.Mul(x.a,y.a)//x.a*y.a
a1.Mod(a1,p)
a2.Mul(x.b,y.c)//x.b*y.c*key
a2.Mod(a2,p)
a2.Mul(a2,w)
a2.Mod(a2,p)
a3.Mul(x.c,y.b)//x.c*y.b*key
a3.Mod(a3,p)
a3.Mul(a3,w)
a3.Mod(a3,p)
res.a.Add(a1,a2)
res.a.Mod(res.a,p)
res.a.Add(res.a,a3)
res.a.Mod(res.a,p)
b1:=big.NewInt(0)
b2:=big.NewInt(0)
b3:=big.NewInt(0)
b1.Mul(x.a,y.b)//x.a*y.b
b1.Mod(b1,p)
b2.Mul(x.b,y.a)//x.b*y.a
b2.Mod(b2,p)
b3.Mul(x.c,y.c)//x.c*y.c*key
b3.Mod(b3,p)
b3.Mul(b3,w)
b3.Mod(b3,p)
res.b.Add(b1,b2)
res.b.Mod(res.b,p)
res.b.Add(res.b,b3)
res.b.Mod(res.b,p)
c1:=big.NewInt(0)
c2:=big.NewInt(0)
c3:=big.NewInt(0)
c1.Mul(x.a,y.c)//x.a*y.c
c1.Mod(c1,p)
c2.Mul(x.b,y.b)//x.b*y.b
c2.Mod(c2,p)
c3.Mul(x.c,y.a)//x.c*y.a
c3.Mod(c3,p)
res.c.Add(c1,c2)
res.c.Mod(res.c,p)
res.c.Add(res.c,c3)
res.c.Mod(res.c,p)
returnres
}
//复数快速幂,注意b不能取模
funcpowerModI(aRing,b,p*big.Int)Ring{
res:=Ring{big.NewInt(1),big.NewInt(0),big.NewInt(0),a.w}
forb.Cmp(big.NewInt(0))!=0{
ifbig.NewInt(0).Mod(b,big.NewInt(2)).Cmp(big.NewInt(1))==0{
res=mulI(res,a,p)
}
a=mulI(a,a,p)
b.Rsh(b,1)
}
returnres
}

声明:个人原创,仅供参考

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
小米打响了整治视频会员的第一枪!网友:雷军才是真的友军呀!

小米打响了整治视频会员的第一枪!网友:雷军才是真的友军呀!

小啾咪侃侃史
2024-11-13 07:55:06
雄鹿加时18分逆转活塞 字母哥狂轰59+14+7创本季第一

雄鹿加时18分逆转活塞 字母哥狂轰59+14+7创本季第一

醉卧浮生
2024-11-14 11:55:30
国家一级演员猝亡,早上犯病到医院去世,悲痛!

国家一级演员猝亡,早上犯病到医院去世,悲痛!

华人星光
2024-11-13 13:05:20
数量几乎超越美俄总和,中国为何要打造,全球最庞大轰炸机梯队

数量几乎超越美俄总和,中国为何要打造,全球最庞大轰炸机梯队

小黎说事
2024-11-14 14:14:05
深圳2女1男蜗居一室卖黄金,涨粉116万!网友:就是博眼球博流量

深圳2女1男蜗居一室卖黄金,涨粉116万!网友:就是博眼球博流量

火山诗话
2024-11-14 08:58:33
去了一趟山姆我才知道的6个事实,月薪3500的我,已经不配逛超市

去了一趟山姆我才知道的6个事实,月薪3500的我,已经不配逛超市

小谈食刻美食
2024-11-12 21:08:41
36岁景甜手术后近况曝光,拄着拐杖上厕所都难,素颜依旧很好看

36岁景甜手术后近况曝光,拄着拐杖上厕所都难,素颜依旧很好看

阿桥侃娱乐
2024-11-13 09:49:33
开发商预言:10年后,国内二三十层的高层住宅,将面临3大问题

开发商预言:10年后,国内二三十层的高层住宅,将面临3大问题

山丘楼评
2024-11-13 11:44:14
波兰你举双手支持对华电车征高额关税,那投资全部转移至斯洛伐克

波兰你举双手支持对华电车征高额关税,那投资全部转移至斯洛伐克

橘色数码
2024-11-14 12:17:19
刘亦菲萝莉岛风波愈演愈烈,博主称画面太真实,造谣源头终于曝光

刘亦菲萝莉岛风波愈演愈烈,博主称画面太真实,造谣源头终于曝光

古希腊掌管月桂的神
2024-11-12 12:47:14
范尼有望重返英超执教,或化身阿莫林对手!多支欲换帅球队关注

范尼有望重返英超执教,或化身阿莫林对手!多支欲换帅球队关注

罗米的曼联博客
2024-11-14 10:27:00
中国已失去耐心,选择直接派军进驻,邻国办不到的事中国亲自办

中国已失去耐心,选择直接派军进驻,邻国办不到的事中国亲自办

猎火照狼山
2024-11-14 00:05:02
周笔畅一头金发独居300平豪宅,穿轻纱裙一改形象,美得像仙女

周笔畅一头金发独居300平豪宅,穿轻纱裙一改形象,美得像仙女

南城无双
2024-11-14 00:24:18
应勇在沪调研:以“时时放心不下”的责任感防风险保安全护稳定

应勇在沪调研:以“时时放心不下”的责任感防风险保安全护稳定

最高人民检察院
2024-11-14 19:09:29
陈赫寝室4个人火了3个,为什么不帮剩下那个?郑恺:真心带不动

陈赫寝室4个人火了3个,为什么不帮剩下那个?郑恺:真心带不动

史诗长歌
2024-11-14 07:30:03
曼联弃将喊话穆里尼奥:还是适应不了你的安排,我又不是水牛埃辛

曼联弃将喊话穆里尼奥:还是适应不了你的安排,我又不是水牛埃辛

穆里尼奥主义者
2024-11-14 14:50:45
女子韩国旅游订房踩坑:每晚标价6万多未看清币种符号,回国后被扣6万元人民币

女子韩国旅游订房踩坑:每晚标价6万多未看清币种符号,回国后被扣6万元人民币

上游新闻
2024-11-13 18:36:19
张雪峰:千万不要混,一个月五千,20岁混到 30 岁就混了六十来万

张雪峰:千万不要混,一个月五千,20岁混到 30 岁就混了六十来万

清风拂心
2024-11-13 14:43:39
历史上“最懒”的诗人:一生就写了一首诗,只有两句,人人都会背

历史上“最懒”的诗人:一生就写了一首诗,只有两句,人人都会背

猫眼观史
2024-11-06 17:26:21
珠海撞人致35人死亡事件,千万别再说是精神病······

珠海撞人致35人死亡事件,千万别再说是精神病······

黑天鹅洞察
2024-11-13 23:33:53
2024-11-14 21:48:49
moonfdd
moonfdd
福大大架构师每日一题
548文章数 15关注度
往期回顾 全部

科技要闻

官宣!极氪领克合并,吉利走向大整合

头条要闻

专家:迎来第二任期 特朗普在外交上或有"干大事"冲动

头条要闻

专家:迎来第二任期 特朗普在外交上或有"干大事"冲动

体育要闻

本季英超最炸裂的瓜,由一名裁判制造

娱乐要闻

娜扎张云龙恋情曝光!甜蜜细节被扒

财经要闻

"机构举报游资"导致A股大跌?

汽车要闻

七块屏幕四座布局 仰望U7中式百万座舱

态度原创

游戏
本地
艺术
手机
公开课

不得了!逆水寒玩家把boss压箱底衣服给扒了,美得让神仙都嫉妒

本地新闻

重庆记忆|别再CityWalk了 来云端之眼CityClimb

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

手机要闻

传音itel S25系列手机发布 配备紫光展锐处理器和后置50MP主摄

公开课

一块玻璃,如何改变人类世界?

无障碍浏览 进入关怀版