将无理分数转换为四个适当/不适当分数的集合

Converting irrational fractions to a set of four proper/improper fractions

本文关键字:四个 不适当 集合 转换      更新时间:2023-10-16

这是我尝试做的示例代码。当然,这需要很长时间才能处理(410^8)。

编辑:

目标是允许在0.0*/1和100.*/1的近似范围内输入实数,例如4577473343788374/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

示例:

π~(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)"

这种类型的循环效率非常低。您正在检查411^8~8x10^20的可能性。正如Ben Voigt所评论的,你可以将其减少大约4倍^2~600,通过选择一组无序的分母和一组有序的分子,但这仍然很可怕(10^17)。

一种快速的简化方法是制作一个分子的排序集合和分母的排序集合,然后循环遍历分母,只检查π乘以分母的正上方和正下方的分子。如果分子的数量是n,如果你有效地做到这一点,这需要大约n log n个步骤。这只是几十亿个步骤,大部分时间都花在了对列表进行排序上,所以你实际上可以做到这一点,你可以并行地对数字进行排序,这样它就可以很容易地扩展。

使用晶格归约对此进行了改进。

然而,以这种方式通过反复试验找到这样一个近似值的整个想法是可怕的。数学中有一个领域叫做丢番图近似,它包括用有理数近似无理数。你可以使用简单连分式理论或Farey序列快速找到好的近似值。这里有一种快速的方法可以找到很多不错的有理近似:从3/1<pi<4/1。将分子和分母相加得到7/2。将圆周率与新分数进行比较。它更低,所以我们有3/1<pi<7/2.迭代。这将达到pi的简单连续部分的所有收敛点,例如22/7、355/113和5419351/1725033。在3.011这样的尴尬情况下,有一些简单的方法可以稍微加快速度,在这种情况下,你可以反复调整一个分数,而不是另一个。

如果出于某种原因,你执着于分数的乘积(这是一个竞赛问题吗?),那么我认为你最好找到所有好的有理近似,然后把它们分解成分子和分母在你指定范围内的分数。

使用以下算法,只需2.08亿步即可轻松完成:

  1. 对1到2.08亿之间的整数进行迭代。

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

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