为什么这是Fermat的分解的错误实现?

时间:2017-05-06 01:40:37

标签: python math factorization

我目前正在使用Project Euler,这是我在问题3中的尝试(在Python中)。我跑了这个并让它持续了大约30分钟。在此之后,我查看了" sum"下的数字。我发现了几个问题:其中一些数字是偶数,因而不是素数,其中一些数字甚至不是n的正确因子。当然,他们只有0.000001(通常除以x.99999230984或其他)。我最终停在的号码是3145819243.0。

有谁可以解释为什么会出现这些错误?

编辑:我对该定理的解释基本上是,通过重新排列变量,你可以用n + y ^ 2的平方根求解x,并且y将被强制执行直到它是一个整数。在此之后,实际的素数因子将是x + y。

这是我的代码。

extension=php_gd2.dll

1 个答案:

答案 0 :(得分:4)

大数和浮点精度的典型问题。

当您到达y = 323734167时,您计算的math.sqrt(n + y**2)math.sqrt(104804411734659032)

根据wolfram alpha,这是3.23735095000000010811308548429078847808587868214170702... × 10^8,即不是整数,而是323735095.0根据python。

如您所见,python没有精确度来查看.00000001...

您可以测试结果的平方:

,而不是测试is_integer
 > 323735095 ** 2
=> 104804411734659025

并查看它是否与输入匹配(输入为104804411734659032,输出为FOREACH p IN PackageManager.FindPackagesForUserWithPackageTypes(null, PackageType_Main|PackageType_Optional) { PACKAGE_INFO_REFERENCE pir OpenPackageInfoByFullName(p.Id.FullName, 0, &pir) UINT32 n=0 GetPackageApplicationIds(pir, &n, null, null) BYTE* buffer = new BYTE[n] UINT32 count=0 GetPackageApplicationIds(pir, &n, buffer, &count) ClosePackageInfo(pir) PCWSTR * applicationUserModelIds = reinterpret_cast<PCWSTR*>(buffer); FOR (i=0; i<count; ++i) { PCWSTR applicationUserModelId = applicationUserModelIds[i] } delete [] buffer } ,关闭7)。