任务如下:给定一个正整数x
和一个素数n > x
,输出最小的正整数y
,使(y * y) mod n = x
。这个问题的重要部分是下面指定的时限,其中不包括强力解决方案。
如果没有这样的值,y
则应输出您的代码N
。
测试用例
(2, 5, N),
(3, 5, N),
(4, 5, 2),
(524291, 1048583, N),
(529533, 1048583, N),
(534775, 1048583, 436853),
(540017, 1048583, 73675),
(536870913, 1073741827, 375394238),
(542239622, 1073741827, 267746399),
(547608331, 1073741827, N),
(552977040, 1073741827, 104595351),
(1099511627676, 1099511627791, N),
(1099511627677, 1099511627791, 269691261521),
(1099511627678, 1099511627791, 413834069585),
(1267650600228229401496703204376, 1267650600228229401496703205653, 5312823546347991512233563776),
(1267650600228229401496703204476, 1267650600228229401496703205653, N)
(1267650600228229401496703204576, 1267650600228229401496703205653, N)
(1267650600228229401496703204676, 1267650600228229401496703205653, 79905476259539917812907012931)
输入输出
您可以采用任何方便的方式输入和输出。如果您不喜欢输出,N
那么任何Falsey
值都可以。
限制条件
您的代码必须在标准台式机上1分钟内回答所有测试用例。该时间限制仅是为了防止强力回答,我希望好的回答几乎可以立即运行。您不得使用任何可解决此问题或测试数字是否为二次余数的库或内建函数。