SageMath:Mod().sqrt() 以 "sqrt" 字符串为前缀,用于 Sagemath 中的特定组合。这是一个错误吗?
SageMath: Mod().sqrt() prefixed with "sqrt" string for a particular combination in Sagemath. Is this a bug?
在 Windows 10
上使用 Sagemath 9.2
a1 = 9798722381116618056227637476565566484018606253194222755351973203508462742253522311154076194134700145275527578605535821781545038187843569198505993524407287520970070771172279404172004212310432500247465608472105231701909612623072343883942216806934904529600639676698348239426243771486521532222069409611514728756060897629936844695006373653175992634673678639333010508845045985607328371180356262460490393317997708599757357055386370808544031455931154122353547239678217006604692623467390849309525705453042722141078914816760002281629323554959490483823338710209710265138177331357093216148991708169324688688552846634664517554736
n = 27772857409875257529415990911214211975844307184430241451899407838750503024323367895540981606586709985980003435082116995888017731426634845808624796292507989171497629109450825818587383112280639037484593490692935998202437639626747133650990603333094513531505209954273004473567193235535061942991750932725808679249964667090723480397916715320876867803719301313440005075056481203859010490836599717523664197112053206745235908610484907715210436413015546671034478367679465233737115549451849810421017181842615880836253875862101545582922437858358265964489786463923280312860843031914516061327752183283528015684588796400861331354873
a2 = Mod(a1, n).sqrt()
我得到以下内容
sage: print(a2)
sqrt9798722381116618056227637476565566484018606253194222755351973203508462742253522311154076194134700145275527578605535821781545038187843569198505993524407287520970070771172279404172004212310432500247465608472105231701909612623072343883942216806934904529600639676698348239426243771486521532222069409611514728756060897629936844695006373653175992634673678639333010508845045985607328371180356262460490393317997708599757357055386370808544031455931154122353547239678217006604692623467390849309525705453042722141078914816760002281629323554959490483823338710209710265138177331357093216148991708169324688688552846634664517554736
如果你观察,a2 的前缀是 sqrt!
我没有看到其他根,我用 Sage 计算。这是什么意思?
这是一个错误还是有其他含义?
看起来 n
是素数(至少是伪素数):
sage: n.is_prime(proof=False)
True
假设是,让我们在n
个元素中定义有限域:
sage: F = GF(n, proof=False)
并将 a1
视为 F
中的元素 A1
:
sage: A1 = F(a1)
询问a1
是否是平方模n
相当于询问 A1
是否是 F
.
中的一个正方形
sage: A1.is_square()
False
不是!所以当我们计算 A1
的平方根时,
它必须是 F
.
的二次扩展
这就是为什么当我们要求 Sage 计算这个平方根时,
它将它作为该扩展的生成器提供。
这个生成器的自然名称是“sqrt(n)”,
这就是 Sage 使用的。
可能,当您计算其他平方根时,
它们是数字的平方根
平方模 n,因此平方根
可以在 F
中计算,即在 ZZ / n ZZ
中,
不需要二次场扩展。
在 Windows 10
上使用 Sagemath 9.2a1 = 9798722381116618056227637476565566484018606253194222755351973203508462742253522311154076194134700145275527578605535821781545038187843569198505993524407287520970070771172279404172004212310432500247465608472105231701909612623072343883942216806934904529600639676698348239426243771486521532222069409611514728756060897629936844695006373653175992634673678639333010508845045985607328371180356262460490393317997708599757357055386370808544031455931154122353547239678217006604692623467390849309525705453042722141078914816760002281629323554959490483823338710209710265138177331357093216148991708169324688688552846634664517554736
n = 27772857409875257529415990911214211975844307184430241451899407838750503024323367895540981606586709985980003435082116995888017731426634845808624796292507989171497629109450825818587383112280639037484593490692935998202437639626747133650990603333094513531505209954273004473567193235535061942991750932725808679249964667090723480397916715320876867803719301313440005075056481203859010490836599717523664197112053206745235908610484907715210436413015546671034478367679465233737115549451849810421017181842615880836253875862101545582922437858358265964489786463923280312860843031914516061327752183283528015684588796400861331354873
a2 = Mod(a1, n).sqrt()
我得到以下内容
sage: print(a2)
sqrt9798722381116618056227637476565566484018606253194222755351973203508462742253522311154076194134700145275527578605535821781545038187843569198505993524407287520970070771172279404172004212310432500247465608472105231701909612623072343883942216806934904529600639676698348239426243771486521532222069409611514728756060897629936844695006373653175992634673678639333010508845045985607328371180356262460490393317997708599757357055386370808544031455931154122353547239678217006604692623467390849309525705453042722141078914816760002281629323554959490483823338710209710265138177331357093216148991708169324688688552846634664517554736
如果你观察,a2 的前缀是 sqrt!
我没有看到其他根,我用 Sage 计算。这是什么意思?
这是一个错误还是有其他含义?
看起来 n
是素数(至少是伪素数):
sage: n.is_prime(proof=False)
True
假设是,让我们在n
个元素中定义有限域:
sage: F = GF(n, proof=False)
并将 a1
视为 F
中的元素 A1
:
sage: A1 = F(a1)
询问a1
是否是平方模n
相当于询问 A1
是否是 F
.
sage: A1.is_square()
False
不是!所以当我们计算 A1
的平方根时,
它必须是 F
.
这就是为什么当我们要求 Sage 计算这个平方根时, 它将它作为该扩展的生成器提供。
这个生成器的自然名称是“sqrt(n)”, 这就是 Sage 使用的。
可能,当您计算其他平方根时,
它们是数字的平方根
平方模 n,因此平方根
可以在 F
中计算,即在 ZZ / n ZZ
中,
不需要二次场扩展。