ZBLOG

y^3=c mod p,c是常数,p是大于等于3的质数,求y。golang里用big.Int,判断模立方根是否存在,也叫三次剩余,如果存在,求模立方根,代码如何写?

在Golang中,您可以使用big.Int来处理大整数运算。要判断模立方根是否存在并求解模立方根,可以使用Tonelli-Shanks算法。下面是一个示例代码:

package main

import (
	"fmt"
	"math/big"
)

func modExp(base, exponent, modulus *big.Int) *big.Int {
	result := big.NewInt(1)
	for exponent.Sign() > 0 {
		if exponent.Bit(0) == 1 {
			result.Mul(result, base).Mod(result, modulus)
		}
		exponent.Rsh(exponent, 1)
		base.Mul(base, base).Mod(base, modulus)
	}
	return result
}

func modSqrt(c, p *big.Int) (*big.Int, bool) {
	if c.Cmp(big.NewInt(0)) == 0 {
		return big.NewInt(0), true
	}

	if !modExp(c, new(big.Int).Div(p.Sub(p, big.NewInt(1)), big.NewInt(2)), p).Cmp(big.NewInt(1)) == 0 {
		return nil, false
	}

	q := new(big.Int).Sub(p, big.NewInt(1))
	s := 0
	for q.Bit(0) == 0 {
		s++
		q.Rsh(q, 1)
	}

	z := big.NewInt(2)
	for ; modExp(z, p.Sub(p.Sub(p, big.NewInt(1)), new(big.Int).Rsh(q.Copy(), uint(s))), p).Cmp(big.NewInt(1)) == 0; z.Add(z, big.NewInt(1)) {
		
    }

	m := s
	candidate := modExp(c.Copy(), new(big.Int).Rsh(new(big.Int).Add(q, big.NewInt(1)), 2), p)
	t := modExp(c.Copy(), q, p)
	r := modExp(c.Copy(), new(big.Int).Add(q, big.NewInt(1)).Rsh(new(big.Int).SetBit(big.NewInt(0), m+1, 1)), p)

	for {
		var i int
		var b *big.Int
		for b = t.Copy(); b.Cmp(big.NewInt(1)) != 0; b.Mul(b, b).Mod(b, p) {
			i++
		}
		
        if i == 0 {
			return candidate.Mod(candidate, p), true
		}
		
        j := m - i - 1
		for ; j > 0; j-- {
			r.Mul(r, r).Mod(r, p)
		}
		
        candidate.Mul(candidate, r).Mod(candidate, p)
		r.Mul(r, r).Mod(r, p)
		t.Mul(t, r).Mod(t, p)
		m = i
    }
}

func main() {
	c := big.NewInt(10) // 常数c,根据需求修改
	p := big.NewInt(11) // 质数p,根据需求修改

	y, exists := modSqrt(c, p)
	if exists {
		fmt.Printf("y = %s\n", y.String())
	} else {
	    fmt.Println("模立方根不存在")
    }
}

请注意,在此示例中,常数c和质数p都是使用big.Int类型表示的大整数。您可以根据自己的需求调整这些值。输出将打印出模立方根y的值,如果模立方根不存在,则会输出”模立方根不存在”。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=10508

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?