gpt4 book ai didi

c++ - C++ 中的费马分解

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:31 26 4
gpt4 key购买 nike

为了好玩,我一直在用 C++ 实现一些数学方面的东西,而且我一直在尝试实现 Fermats Factorisation Method ,但是,我不知道我理解它应该返回什么。对于维基百科文章中给出的示例编号 5959,我的这个实现返回 105

维基百科中的伪代码如下所示:

One tries various values of a, hoping that is a square.

FermatFactor(N): // N should be odd
a → ceil(sqrt(N))
b2 → a*a - N
while b2 isn't a square:
a → a + 1 // equivalently: b2 → b2 + 2*a + 1
b2 → a*a - N // a → a + 1
endwhile
return a - sqrt(b2) // or a + sqrt(b2)

我的 C++ 实现如下所示:

int FermatFactor(int oddNumber)
{
double a = ceil(sqrt(static_cast<double>(oddNumber)));
double b2 = a*a - oddNumber;
std::cout << "B2: " << b2 << "a: " << a << std::endl;

double tmp = sqrt(b2);
tmp = round(tmp,1);
while (compare_doubles(tmp*tmp, b2)) //does this line look correct?
{
a = a + 1;
b2 = a*a - oddNumber;
std::cout << "B2: " << b2 << "a: " << a << std::endl;
tmp = sqrt(b2);
tmp = round(tmp,1);
}

return static_cast<int>(a + sqrt(b2));
}

bool compare_doubles(double a, double b)
{
int diff = std::fabs(a - b);
return diff < std::numeric_limits<double>::epsilon();
}

它应该返回什么?好像只是返回a + b,这不是5959的因素吗?

编辑

double cint(double x){
double tmp = 0.0;
if (modf(x,&tmp)>=.5)
return x>=0?ceil(x):floor(x);
else
return x<0?ceil(x):floor(x);
}

double round(double r,unsigned places){
double off=pow(10,static_cast<double>(places));
return cint(r*off)/off;
}

最佳答案

请注意,您应该在整数类型而不是浮点类型上进行所有这些计算。它会简单得多(也可能更正确)。


您的compare_doubles 函数有误。 diff 应该是 double

一旦你解决了这个问题,你就需要修复你的测试线。 compare_doubles 如果其输入“几乎相等”,则返回 true。您需要在它们“不几乎相等”时循环。

所以:

bool compare_doubles(double a, double b)
{
double diff = std::fabs(a - b);
return diff < std::numeric_limits<double>::epsilon();
}

和:

while (!compare_doubles(tmp*tmp, b2))  // now it is
{

你会得到这个输入的正确结果 (101)。

您还需要使用 0 作为“位置”调用您的 round 函数,如 vhallac指出 - 你不应该四舍五入到小数点后一位数。

您链接的维基百科文章中的方程式可让您从 Na-b 中识别出 b

关于c++ - C++ 中的费马分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10474173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com