这是我想要做的示例代码。当然这需要永远处理(410 ^ 8)。
编辑:
目标是允许在0.0 * / 1和100。* / 1的近似范围内输入实数。 .457473343788374 / 1,8.5476457654 / 1使用四个分数得到最佳可能的近似值,所有四个分数都具有两个指定约束之间的整数(例如16到400)。
分数代表机器中的齿轮齿,需要精确定时并且能够在给定空间内拟合。想想Antikythera机制。
主要目标是在找到近似近似时不停止,而是找到即使以效率为代价也无法在上改进的最佳近似值。
是否有针对此类问题的算法?
for(auto_t num_1 = 20; num_1 != 431; num_1++)
{
for(auto_t num_2 = 20; num_2 != 431; num_2++)
{
for(auto_t num_3 = 20; num_3 != 431; num_3++)
{
for(auto_t num_4 = 20; num_4 != 431; num_4++)
{
for(auto_t num_5 = 20; num_5 != 431; num_5++)
{
for(auto_t num_6 = 20; num_6 != 431; num_6++)
{
for(auto_t num_7 = 20; num_7 != 431; num_7++)
{
for(auto_t num_8 = 20; num_8 != 431; num_8++)
{
nOutput = double(num_1*num_2*num_3*num_4)/(num_5*num_6*num_7*num_8);
}
}
}
}
}
}
}
}
我写了一些相当快速的东西并返回看起来准确的结果。
位于此处(64位,Vista或更新版本):http://1drv.ms/1zgpQnB
示例:
pi ~~(323 * 379 * 413 * 388)/(235 * 283 * 229 * 410)如何使用20到430范围确认这是否尽可能准确?或者不(我怀疑不是)。
更多:
pi ~~(381 701 341 523)/(309 573 128 669)使用25至750作为约束。
cos(45d)~~(617 713 723 92)/(485 734 263 442)''
答案 0 :(得分:3)
这种类型的循环非常低效。您正在检查411 ^ 8~8x10 ^ 20种可能性。正如Ben Voigt评论的那样,你可以通过选择一组无序的分母和一组无序的分子来减少大约4倍!^ 2~600,但这仍然很糟糕(10 ^ 17)。
一个快速缩减是制作一个分类的分类集合和一个分类的分母集合,然后循环分母,只检查上面的分子和正好在分母的pi之下。如果分子数为n,如果有效地执行,则需要大约n log n步。这只是几十亿步,主要用于对列表进行排序,因此您可以实际执行此操作,并且可以并行对数字进行排序,以便可以轻松扩展。
使用晶格缩减对此有所改进。
然而,通过这种方式通过反复试验找到这种近似的整个想法是可怕的。有一个称为丢番图逼近的数学领域,其中包括通过有理数近似无理数。您可以使用简单连续分数理论或Farey序列快速找到良好的近似值。这是一种快速查找大量合理近似值的方法:从3/1开始< pi< 4/1。添加分子和分母得到7/2。将pi与新分数进行比较。它更低,所以我们有3/1< pi< 7/2。重复。这将击中pi的简单连续分数的所有收敛,例如22 / 7,355 / 113和5419351/1725033。有很多简单的方法可以在像3.011那样笨拙的情况下略微提高速度,你可以反复调整一个分数而不是另一个分数。
如果由于某种原因你附加了分数的产品(这是一个竞赛问题吗?),那么我认为你最好找到所有良好的理性近似值,然后将这些分解为分数和分母的分数。您指定的范围。
答案 1 :(得分:0)
使用以下算法可以轻松完成约2.08亿步骤:
将整数从1到2.08亿迭代。
对于每个整数计算,得到的分母接近所需分数,并以该数字作为分子。
对于接近前一个最佳对的每个这样的分子/分母对,看看分子和分母是否可以根据需要进行分解。如果是这样,请更新最佳对。