开根号的小妙招
提前声明,这个投稿几乎没有价值,因为真遇到了麻烦的开方,你一定会用计算器而不是手算,也就是说,事实上我这个投稿没什么大的价值。
平常的时候,我会把一些奇怪的想法记下来,如果是涉及到数学/物理的问题,有时候我会动手算算,记下来,仅供娱乐而已。(说实话,备考期间,除了备考什么都有意思 嘿嘿)
大概有一年多了,一年前看到一个关于如何快速开平方的视频,于是我动手研究了一下。这份手稿完成之后压在其他手稿中,直到今天。闲话少说,开始正题吧。(我还是不会用高端的符号插入和公式插入,难受)
本文研究的内容是:快速开平方的评价以及使用范围。
核心思想是:
当x足够大而Δx相对足够小时,便可忽略不计,这样我们的计算方法就来了,操作如下:
首先针对你要开方的对象,比如数字 N,你需要先找到 [
](其中 [x]函数定义为:向下取整数),将其记为
。
计算
,将其记为
,那么最终的结果可记为:
举个例子,由计算器可知=10.39230485,带入上述式子中得到:
对比可得,确实如此,10.4≈10.39......,通过计算器计算,二者误差为0.074%,很不错的精度。
以上就是开方的使用方法。
下面讨论开方的使用范围。由于我们假定了,那么在
差距不大的时候会出现明显的误差。那么问题来了,假定我需要一个精度,那么上述的快速开方法的使用下线在哪里呢?我们现在来研究研究。
为了方便研究,我们需要事先定义几个量。
为开方对象,
,
,如此便能表示为:
。
我们再定义:,
。如此便有
定义一个精度函数,其含义为:快速开方的约数与开方的精准的数之比。显然,
即为相对误差。
很好,前置工作已经完成,现在我们的问题在于:假如我现在需要一个精度,比如最多1%的误差,那么对应的或
最小为多少?
现在取误差为1%,即
现在我们需要对精度函数进行一个展开:
这里需要提一嘴,由于快速开方的特性,所以有,各位有兴趣的小伙伴可以自己去想想为什么哦。所以对应于误差1%,我们取
(极限条件)。
解得
由于,所以舍去后面一个答案。
故
而我们也知道,
可得:
然后就得到了:
很显然,当,即左逼近时,误差会到达最大,也就是说,这又是一个极限情况,令
,此时
解得,取个整数吧,还要考虑到
是个平方数,就取
。
也就是说,当时,我们能保证快速开方法的误差保持在1%内。
让我们来演算一下吧,
%
%
%
和我们的结论有点点小出入,但是问题不大,就目前来看在时,确实能够保持1%(左右)内的误差,能用就行要啥自行车啊!
好的,问题又来了,0.1%的精度呢?更好的精度呢?我也能解决!
假设目标精度为10^t,其中t=-n, n为大于零的整数,也就是10^(-n)的误差。
取到小数点后n位,wtm直接带入!(为什么我要绕个圈子呢?因为指数符号后面只能带一个符号,而 -n 不会把n带上,就很难受)
解得
极限条件下,令,有
代入中,有
得到:
则在精度10^(-n),即取小数点后n位的要求下,
开方数,
或者说
其中t=-n,n为大于0的整数。
很好,最重要的工作已经完成,现在就是需要代入具体的数字来一波演算(懒得算,直接给结果)。
n=2时,,取7,和上面的结论是一致的。
n=3时,,取22
现在你想要的精度你可以直接得到了,有意思吧
至于开立方么,我这写完平方之后就没写下去了,估计感觉烦了就不写了吧。但是我应该可以给出一个好的“指导”:
是开立方的整数,
,则估算值就是
如果是开k次方呢?简单!
/[
^
] (还是和上面一样的问题,我搞不来啊!)
在开k次方的情况下要求误差小于(t=-n,n为正整数)呢?简单!
直接取极限条件,令,化简可得:


可见,我们得到了一个一元k次方程,有亿点难度......
我的某个m开头数学软件罢工了,表示算不出来,那算了,我这里探讨一下解的存在性问题。
令
导一下,并令导数为0,解得:。
如果观察导函数,会发现这应该是个单调递增有零点的函数,显然:
由于题设k为正整数,所以一定有
又有 以及
,所以得到结论:
至少有两个不同的实数解。考虑到导函数的单调性,得到最终结论:
有且仅有两个不同的实数解。(当然,我这里并不想考虑复数解的存在的意义)。这一结论与前面的推导是一致的。值得注意的是,由于α>1,所以解一定取的是右边的那个解。
所以,解是肯定存在的,但是我算不出来而已。
那我就束手无策了吗?
大错特错!我不是还有python吗!!!!
编程目的:找到一个整数N,使得在使用快速开方法后满足误差在10^-n以内而整数N-1不满足。
核心思想:上面提到的算式。
输入有:开方根次k,误差度n。
以上就是代码,但是有一个问题:经过试验,当你输入的n和k稍微大一点点的时候,10000的循环上线就不够用了,你要是加大数量的话,那必然运行半年都出不来。
突然想到,这个结果是满足单调性的,因为只要满足了某一个值,那么后面的值都会满足,那么这个可以用二分枚举啊!好!来!(我不是学计算机,也不是专门学算法的,如果名字叫错了请见谅)
完成辣!但是有一个小毛病,我遇到一点bug:开二次根号任意精度都不会出问题,但是只要开三次根号就出问题,没有输出,我也不知道是为什么。
我去,从10:30码字到14:32(中间吃了个饭,代码也是现码的),整整四个小时的跨度,真刺激,午睡去了。