五十七、平方根收敛(Square root convergents)

二的平方根可以表示为以下这个无穷连分数:

\[\sqrt 2 =1+ \frac 1 {2+ \frac 1 {2 +\frac 1 {2+ \dots}}}
\]

通过把前四项展开,我们得到:

\[\begin{aligned}1 + \frac 1 2 &= \frac 32 = 1.5\\1 + \frac 1 {2 + \frac 1 2} &= \frac 7 5 = 1.4\\1 + \frac 1 {2 + \frac 1 {2+\frac 1 2}} &= \frac {17}{12} = 1.41666 \dots\\1 + \frac 1 {2 + \frac 1 {2+\frac 1 {2+\frac 1 2}}} &= \frac {41}{29} = 1.41379 \dots\end{aligned}
\]

接下来三项展开式为\(99/70,239/169\)和\(577/408\),但是第八项是\(1393/985\),是第一个分子的位数超过分母的位数的例子。

求在前一千项展开式中,有多少分数的分子位数超过分母的位数?

分析:首先我们可以推导出上面的展开式中分子和分母的递推式:设\(a_k=n_k/d_k\)表示第\(k\)项展开式,则易知:

\[a_{k+1}=1+\frac{1}{1+a_k}=1+\frac{1}{1+n_k/d_k}=1+\frac{d_k}{d_k+n_k}=\frac{2d_k+n_k}{d_k+n_k}
\]

即对于第\(k+1\)项展开式,其分子为\(2d_k+n_k\),分母为\(d_k+n_k\)。因此我们可以根据这个递推关系计算每一项展开式的分子与分母,对其取以十为底的对数判断其位数,然后统计分子位数大于分母位数的项,即为题目所求。代码如下:

# time cost = 885 µs ± 9.93 µs

from math import log10

def main(N=1000):
c,n,d = 0,1,1
for i in range(N):
n,d = 2 * d + n,d + n
if int(log10(n)) > int(log10(d)):
c += 1
return c

Project Euler 57: Square root convergents的更多相关文章

  1. Project Euler #80: Square root digital expansion

    from decimal import getcontext, Decimal def main(): n = int(raw_input()) p = int(raw_input()) getcon ...

  2. (Problem 57)Square root convergents

    It is possible to show that the square root of two can be expressed as an infinite continued fractio ...

  3. 欧拉工程第57题:Square root convergents

    题目链接 Java程序 package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; impo ...

  4. Project Euler 92:Square digit chains C++

    A number chain is created by continuously adding the square of the digits in a number to form a new ...

  5. Project Euler 80:Square root digital expansion 平方根数字展开

    Square root digital expansion It is well known that if the square root of a natural number is not an ...

  6. Project Euler 59: XOR decryption

    计算机上的每个字母都对应一个独特的编号,普遍接受的标准是ASCII(美国信息交换标准代码).例如,大写字母的A的ASCII码是65,星号(*)的ASCII码是42,而小写字母k的代码是107. 一种现 ...

  7. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  8. Python练习题 034:Project Euler 006:和平方与平方和之差

    本题来自 Project Euler 第6题:https://projecteuler.net/problem=6 # Project Euler: Problem 6: Sum square dif ...

  9. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

随机推荐

  1. B-概率论-条件概率

    目录 条件概率 一.条件概率简介 二.条件概率推广 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblo ...

  2. ubuntu14.04 安装tensorflow始末

    基于ubuntu14.04 干净的系统一步步遇到的坑记录下来: 怀着平静学习的心情,问题总的能解决的! 1. 首先看了下当前python版本 python --version Python 2.7.6 ...

  3. 奇淫异巧之 PHP 后门

    整理大部分来源信安之路 对于隐蔽来说,有以下几点要素: 1.熟悉环境,模拟环境,适应环境,像一只变色龙一样隐藏 2.清除痕迹,避免运维发现 3.避免后门特征值被 D 盾等工具检测到 姿势 一般过狗思路 ...

  4. PHP7源码之array_unique函数分析

    以下源码基于 PHP 7.3.8 array array_unique ( array $array [, int $sort_flags = SORT_STRING ] ) (PHP 4 >= ...

  5. NodeJS操作MongoDB数据库

    一.node.js对于mongodb的基本操作 1.数据库的开机 首先我们要先对数据库进行开机的操作,建立一个文件夹用于存放数据库文档.如D:\mongo,接下去在cmd当中键入命令-> mon ...

  6. Libevent::evhttp服务器

    #include <cstdio> #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  7. 使用IIS部署网站

    使用IIS部署网站的步骤: IIS安装:控制面板->启用或关闭Windows功能->Internet信息服务->应用程序开发功能,勾选.net和asp相关的,和服务器端包含 ASP. ...

  8. python学习-正则表达式(十)

    1.查看re模块的全部属性和函数 >>>import re,pprint >>>pprint.pprint(re.__all__) ['match', 'fullm ...

  9. 20.discuz论坛-实现伪静态

    部署discuz论坛 1.直接上配置文件--->>> [root@web01 conf.d]# vim discuz.cheng.com.conf server { listen 8 ...

  10. 如果有人问你 MySql 怎么存取 Emoji,把这篇文章扔给他

    01.前言 Emoji 在我们生活中真的是越来越常见了,几乎每次发消息的时候不带个 Emoji,总觉得少了点什么,似乎干巴巴的文字已经无法承载我们丰富的感情了.对于我们开发者来说,如何将 Emoji ...