将无理分数转换为四个适当/不适当分数的集合
Converting irrational fractions to a set of four proper/improper fractions
这是我尝试做的示例代码。当然,这需要很长时间才能处理(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到2.08亿之间的整数进行迭代。
-
对于每个整数,以该数字为分子,计算接近所需分数的分母。
-
对于每一个更接近前一个最佳分子/分母对的分子/分母,看看是否可以根据需要计算分子和分母。如果是,请更新最佳配对。
- 找到四个 10 的所有表达式
- 如何在 c++ 中存储具有值的四个参数的元组
- C++ 函数,用于查找数组中四个最小最大元素的总和不起作用
- 如何使用模板元编程在自由函数C++链接两个不相关的类
- 输入两个不专门化大小的矩阵
- 如何实现四个 i8 元素组的高效_mm256_madd_epi8点积
- 如何将无符号的 int 值解释为四个字母的单词?
- 如何让变量随机输出四个单词之一
- 如何在它们之间分配和使用 2 个不同类的函数指针?
- 如何校准相机焦距,平移和旋转给定四个点
- 从两个不同类继承的非虚拟基类的访问成员
- 如何解决两个不使用命名空间的第三方库之间的类名冲突?
- C++ I/O 流重载:如何实现同一标头中相同 4 个 I/O 函数的 3 个不同类的友元重载?
- 这C++ unordered_map怎么有四个值?我以为这是一个键值对
- 我想将四个字节合并为一个数字以进行串行传输
- 使用转换运算符相互转换两个不同类的对象
- 如何在交换机中将一个枚举值标记为不适当的大小写
- C 四个旋转不按预期工作
- 缩短条件以检查x是否不是四个数字中的任何一个
- 将无理分数转换为四个适当/不适当分数的集合