将无理分数转换为一组四个适当/不适当的分数

时间:2014-09-25 13:30:19

标签: c++ math

这是我想要做的示例代码。当然这需要永远处理(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)''

2 个答案:

答案 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. 将整数从1到2.08亿迭代。

  2. 对于每个整数计算,得到的分母接近所需分数,并以该数字作为分子。

  3. 对于接近前一个最佳对的每个这样的分子/分母对,看看分子和分母是否可以根据需要进行分解。如果是这样,请更新最佳对。