- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找一种算法(最好是在 Go 或 C 中)以在可能的分母(dmin,dmax with 1 <= dmin <= dmax <= 1e15)的包含范围内找到最接近 Pi 的公共(public)分数 n/d ).如果有多个公分数到 Pi 的距离相同,我想找到分母最小的分数。
注意:暴力破解方法不够有效,因此我正在寻找更智能/更有效的解决方案。
示例:对于 dmin=1 和 dmax=10,最接近的公分数是 22/7,与 Pi 的距离约为 0.001
第一个想法:查看 faey 序列,我们可以找到所有分母最接近 dmax 的近似值。不幸的是,该结果不满足 dmin 的约束。
最佳答案
我没有时间给出完整的答案,但这里是部分答案。这种技术使用连分数的概念——网上有很多关于它们的内容。我会忽略你的值 dmin,下面没有使用它。
获取continued fraction expansion of pi到你需要的许多地方。对于 dmax <= 1e15 的界限,您只需要前 28 个数字,即
[3, 7, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1, 14, 2, 1, 1, 2, 2, 2, 2, 1, 84, 2, 1, 1, 15, 3, 13]
使用短循环找到分母刚好低于和高于 dmax 的 pi 的收敛点。在 Python 中是
pi_cont_frac = [3, 7, 15, 1, 292, 1, 1, 1, 2, 1,
3, 1, 14, 2, 1, 1, 2, 2, 2, 2,
1, 84, 2, 1, 1, 15, 3, 13]
denomlo, denomhi = 1, 0
numlo, numhi = 0, 1
for q in pi_cont_frac:
denomlo, denomhi = denomhi, q * denomhi + denomlo
numlo, numhi = numhi, q * numhi + numlo
if denomhi > dmax:
break
有些软件,例如 Microsoft Excel,会使用分数 numlo/denomlo
,但可能有比这更好的近似值。现在找到使 denomhi - r * denomlo
刚好低于(或等于)dmax 的自然数 r 的值。
那么 numlo/denomlo
或 (denomhi - r * denomlo)/(denomhi - r * denomlo)
就是你想要的最接近圆周率的分数。只需检查哪个更近即可。
此算法的阶数为 log(dmax),并且由于 pi 的属性,它通常要低得多。对于 dmax <= 1e15,它需要 28 个循环,但需要更多的清理语句。
您可以通过预先计算和存储收敛值(numhi 和 denomhi 的值)并搜索刚好高于 dmax 的 denomhi 值来创建更快的算法。这也只需要 28 个数字,但分子和分母都需要这个。二进制搜索最多需要 5 步才能找到它——几乎是瞬时的。使用更多存储和更少计算的另一种可能性是存储所有中间分数。那个存储量将达到数百个,至少三百个。如果您不喜欢 pi 的连续分数扩展的存储列表,您可以使用 pi 的值来即时计算它,但是使用 double (在 C 中)只会让您得到我向您展示的 28 个数字.
要进行更多研究,请查找连分数和中间分数。
关于algorithm - 为给定的分母范围找到最接近的 Pi 近似值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42470922/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!