project euler 686 (2的幂的前3位)???
第678910个满足$2^i$前3位是$123$的,求$i$
看了几个, 方案
截断15位/double(相当于截断)
log转换乘为加法,本质上还是精度和截断?
递增:196/289/485(=196+285),还是要截断 (这三个还是容易得到, 但也可能更大的组合(485+196=681))
2**196=100433627766186892221372630771322662657637687111424552206336
2**289=994646472819573284310764496293641680200912301594695434880927953786318994025066751066112
2**485=99895953610111751404211111353381321783955140565279076827493022708011895642232499843849795298031743077114461795885011932654335221737225129801285632
所以, 或者有什么精度估计的方法?
感觉
都可能有精度问题,只是刚好得到正确答案过了?????
所以有更正确的方案吗?或者证明上面正确性的方案
这篇似乎在证 https://projecteuler.net/action=redirect;post_id=342800
log
文章还提到了 log与渐进分数,递增与渐进分数分母的关系
$1.23 x 10^k <= 2^i < 1.24x10^k$
$log_{10}{1.23} + k <= i \cdot log_{10}{2} < log_{10}{1.24} + k$
$93 \log_{10}2= 27.995789596750246 \equiv -0.00421040324975408 \pmod {1}$
$196 \log_{10}2= 59.001879150140304 \equiv 0.001879150140304 \pmod {1}$
$289 \log_{10}2= 86.99766874689055 \equiv -0.00233125310945 \pmod {1}$
$485 \log_{10}2= 145.99954789703085 \equiv -0.00045210296915 \pmod {1}$
首先在$1~485$内,只有$196,289,485$是小于$l = log_{10}{(123+1)} - log_{10}{123} = 0.003516573722837535$的
考虑一个合法的i,得到的 $i\cdot log_{10}{2} - log_{10}{1.23}$的小数部分x
$x \in [0,0.001637423582533535(= 0.003516573722837535-0.001879150140304)]$,那么+196 依然在区间中
$x \in [0.00233125310945, 0.003516573722837535]$,那么+289 依然在区间中
$x \in x \in [0.00045210296915, 0.003516573722837535]$,那么+485 依然在区间中
三个区间的并 刚好是整个区间
综上,我们证明了间隔只是这3个中的
精度
其实有了这个大于小于表达式,i的精度可以观察差值, 与 可信位数乘以乘法的比较
$i\cdot log_{10}{2} - log_{10}{1.23}$的小数部分, 到$[0,0.003516573722837535]$ 的两边界
与$i$ 乘上$log_{10}{2}$的不可信位数之间的关系