我们希望因式分解半素。这项挑战的目标是找到两个小整数和,用Fermat方法将分解为,从而可以轻松的因数。ü v ü v ñ ñNuvuvNN
任务
给定一个半素数 和一个正整数,我们将和定义为:ķ X ÿNkxy
Ŷ=X2-ķÑ
x=⌈kN−−−√⌉
y=x2−kN
步骤#1-查找k
首先,您需要找到k的最小可能值,以k使y为平方数(也称为完美平方)。
这允许通过Fermat分解因子方法的单次迭代分解kN。更具体地说,这立即导致:ķ ñ
kN=(x+y√)×(x−y√)
(更新:此序列现在发布为A316780)
步骤#2-分解ķ
然后,您必须找到两个正整数ü和v,使得:
c u = x + √
uv=k
dv=X- √cu=x+y√
dv=x−y√
其中c和d是N的素因N。
摘要
您的任务是编写一个程序或函数,将作为输入,并以任何顺序和任何合理的格式打印或输出和。ü vNuv
例
让我们考虑N=199163
步骤1
的最小可能值是,这给:40k40
ÿ=28232-40×199163=7969329-7966520=2809=532ķÑ=(2823+53)×(2823-53)ķÑ=2876×2770
x = ⌈ (40 × 199163----------√)⌉ = 2823
ÿ= 28232- 40 × 199163 = 7969329 - 7966520 = 2809 = 532
ķ ñ= (2823 + 53 )× (2823 - 53 )
ķ ñ= 2876 × 2770
第2步
的正确因式分解为,因为:ķ = 4 × 10ķk = 4 × 10
ķ ñ= 2876 × 2770
ķ ñ= (719 × 4 )× (277 × 10 )
ñ=719×277
因此,正确答案应该是或。[4,10][10,4]
规则
- 不需要严格执行上述两个步骤。您可以自由使用任何其他方法,只要它找到和的正确值即可。uv
- uvN
- 输入保证为半素数。
- 这是代码高尔夫球,因此最短的答案以字节为单位。
- 禁止出现标准漏洞。
测试用例
N | k | Output
-----------+------+------------
143 | 1 | [ 1, 1 ]
2519 | 19 | [ 1, 19 ]
199163 | 40 | [ 4, 10 ]
660713 | 1 | [ 1, 1 ]
4690243 | 45 | [ 9, 5 ]
11755703 | 80 | [ 40, 2 ]
35021027 | 287 | [ 7, 41 ]
75450611 | 429 | [ 143, 3 ]
806373439 | 176 | [ 8, 22 ]
1355814601 | 561 | [ 17, 33 ]
3626291857 | 77 | [ 7, 11 ]
6149223463 | 255 | [ 17, 15 ]
6330897721 | 3256 | [ 74, 44 ]
示例实施
fNuv
gNuvNO(1)
f = N => {
for(k = 1;; k++) {
x = Math.ceil(Math.sqrt(k * N));
y = x * x - k * N;
ySqrt = Math.round(Math.sqrt(y));
if(ySqrt * ySqrt == y) {
p = x + ySqrt;
for(u = 1;; u++) {
if(!(p % u) && !(N % (p / u))) {
v = k / u;
return [ u, v ];
}
}
}
}
}
g = (N, u, v) => {
x = Math.ceil(Math.sqrt(u * v * N));
y = x * x - u * v * N;
ySqrt = Math.round(Math.sqrt(y));
p = x + ySqrt;
q = x - ySqrt;
return [ p / u, q / v ];
}
[
143, 2519, 199163, 660713, 4690243, 11755703,
35021027, 75450611, 806373439, 1355814601,
3626291857, 6149223463, 6330897721
]
.map(N => {
[u, v] = f(N);
[c, d] = g(N, u, v);
console.log(
'N = ' + N + ', ' +
'u = ' + u + ', ' +
'v = ' + v + ', ' +
'N = ' + c + ' * ' + d
);
});
N
实际上是半素数?