欢迎光临散文网 会员登陆 & 注册

开根号的小妙招

2023-08-29 14:34 作者:丝芬周  | 我要投稿

提前声明,这个投稿几乎没有价值,因为真遇到了麻烦的开方,你一定会用计算器而不是手算,也就是说,事实上我这个投稿没什么大的价值。

平常的时候,我会把一些奇怪的想法记下来,如果是涉及到数学/物理的问题,有时候我会动手算算,记下来,仅供娱乐而已。(说实话,备考期间,除了备考什么都有意思   嘿嘿)

大概有一年多了,一年前看到一个关于如何快速开平方的视频,于是我动手研究了一下。这份手稿完成之后压在其他手稿中,直到今天。闲话少说,开始正题吧。(我还是不会用高端的符号插入和公式插入,难受)

本文研究的内容是:快速开平方的评价以及使用范围。

核心思想是:x%2B%CE%94x%3D%5Csqrt%7Bx%5E2%2B2x%CE%94x%2B%CE%94x%5E2%7D%20%E2%89%88%5Csqrt%7Bx%5E2%2B2x%CE%94x%7D%20

当x足够大而Δx相对足够小时,%CE%94x便可忽略不计,这样我们的计算方法就来了,操作如下:

  1. 首先针对你要开方的对象,比如数字 N,你需要先找到 [%5Csqrt%7BN%7D%20](其中 [x]函数定义为:向下取整数),将其记为x

  2. 计算 %5Cfrac%7BN-x%5E2%7D%7B2x%7D%20,将其记为%CE%94x,那么最终的结果可记为:%5Csqrt%7BN%7D%20%E2%89%88%20x%2B%CE%94x%20%3D%20%5B%5Csqrt%7BN%7D%20%5D%20%2B%20%5Cfrac%7BN-x%5E2%7D%7B2x%7D%20%20

举个例子,由计算器可知%5Csqrt%7B108%7D%20=10.39230485,带入上述式子中得到:

x%3D%5B%5Csqrt%7B108%7D%5D%3D10%20

%CE%94x%3D%5Cfrac%7B108-10%5E2%7D%7B2*10%7D%20%3D0.4

%E5%88%99%5Csqrt%7B108%7D%20%E2%89%8810%2B0.4%3D10.4

对比可得,确实如此,10.4≈10.39......,通过计算器计算,二者误差为0.074%,很不错的精度。

以上就是开方的使用方法。

下面讨论开方的使用范围。由于我们假定了%CE%94x%5Cll%20x,那么在%CE%94x%E5%92%8Cx差距不大的时候会出现明显的误差。那么问题来了,假定我需要一个精度,那么上述的快速开方法的使用下线在哪里呢?我们现在来研究研究。

为了方便研究,我们需要事先定义几个量。

N为开方对象,N_%7B0%7D%20%3Dx%5E2N_%7B1%7D%3D(x%2B1)%5E2%20,如此便能表示为:N_%7B0%7D%20%5Cleq%20N%20%5Cleq%20N_%7B1%7D%20

我们再定义:N_%7B0%7D'%20%3DxN_%7B1%7D'%20%3Dx%2B1。如此便有N_%7B0%7D'%20%20%5Cleq%20%20x%2B%CE%94x%20%5Cleq%20N_%7B1%7D'%20

定义一个精度函数D(N)%3D%5Cfrac%7BN_%7B0%7D'%2B%5Cfrac%7BN-N_%7B0%7D%20%7D%7B2N_%7B0%7D'%20%7D%20%20%7D%7B%5Csqrt%7BN%7D%20%7D%20,其含义为:快速开方的约数与开方的精准的数之比。显然,%7C1-D(N)%7C即为相对误差。

很好,前置工作已经完成,现在我们的问题在于:假如我现在需要一个精度,比如最多1%的误差,那么对应的N_%7B0%7D'%20N_%7B0%7D%20最小为多少?

现在取误差为1%,即%7C1-D(N)%7C%3D0.01

现在我们需要对精度函数进行一个展开:

D(N)%3D%5Cfrac%7BN_%7B0%7D'%2B%5Cfrac%7BN-N_%7B0%7D%20%7D%7B2N_%7B0%7D'%20%7D%20%20%7D%7B%5Csqrt%7BN%7D%20%7D%20%3D%5Cfrac%7B2N_%7B0%7D'%5E2%20%2BN-N_%7B0%7D%20%7D%7B2N_%7B0%7D'%5Csqrt%7BN%7D%20%20%7D%20%3D%5Cfrac%7BN_%7B0%7D'%5E2%20%2BN%20%7D%7B2N_%7B0%7D'%5Csqrt%7BN%7D%20%20%7D%20

这里需要提一嘴,由于快速开方的特性,所以有D(N)%3E1,各位有兴趣的小伙伴可以自己去想想为什么哦。所以对应于误差1%,我们取D(N)%5Cleq%201.01(极限条件)。

D(N)%3D%5Cfrac%7BN_%7B0%7D'%5E2%20%2BN%20%7D%7B2N_%7B0%7D'%5Csqrt%7BN%7D%20%20%7D%20%3D1.01

解得%5Csqrt%7BN%7D%20%3D%5Cfrac%7B2.02N_%7B0%7D'%C2%B1%5Csqrt%7B(2.02N_%7B0%7D')%5E2-4N_%7B0%7D'%5E2%7D%20%20%7D%7B2%7D%E2%89%881.15N_%7B0%7D'%20%E6%88%96%200.868N_%7B0%7D'%20

由于%5Csqrt%7BN%7D%3EN_%7B0%7D'%20,所以舍去后面一个答案。

N%3D1.322N_%7B0%7D

而我们也知道,N_%7B0%7D'%2B1%3DN_%7B1%7D'

可得:N_%7B1%7D%3DN_%7B0%7D%2B2%5Csqrt%7BN_%7B0%7D%7D%2B1%20

然后就得到了:%5Cfrac%7BN_%7B1%7D-N_%7B0%7D%7D%7BN_%7B0%7D%7D%20%3D%5Cfrac%7B2%5Csqrt%7BN_%7B0%7D%7D%20%2B1%7D%7BN_%7B0%7D%7D%20%3D%5Cfrac%7B2%7D%7B%5Csqrt%7BN_%7B0%7D%7D%7D%2B%20%5Cfrac%7B1%7D%7BN_%7B0%7D%7D%20%20

很显然,当N%5Crightarrow%20N_%7B1%7D%5E-,即左逼近时,误差会到达最大,也就是说,这又是一个极限情况,令N_%7B1%7D%3D1.322N_%7B0%7D,此时%5Cfrac%7BN_%7B1%7D-N_%7B0%7D%7D%7BN_%7B0%7D%7D%20%3D%5Cfrac%7B2%7D%7B%5Csqrt%7BN_%7B0%7D%7D%7D%2B%20%5Cfrac%7B1%7D%7BN_%7B0%7D%7D%20%20%3D0.322

解得N_%7B0%7D%3D44.57%20,取个整数吧,还要考虑到N_%7B0%7D是个平方数,就取49

也就是说,当N_%7B0%7D%5Cgeq%2049时,我们能保证快速开方法的误差保持在1%内。

让我们来演算一下吧,

D(63)%3D%5Cfrac%7B8-7.937%7D%7B7.937%7D%20%3D0.79%25%

D(120)%3D%5Cfrac%7B11-10.95%7D%7B10.95%7D%20%3D0.46%25%

D(48)%3D%5Cfrac%7B7-6.93%7D%7B6.93%7D%20%3D1.01%25%

和我们的结论有点点小出入,但是问题不大,就目前来看在N%5Cgeq%2049时,确实能够保持1%(左右)内的误差,能用就行要啥自行车啊!


好的,问题又来了,0.1%的精度呢?更好的精度呢?我也能解决!

假设目标精度为10^t,其中t=-n, n为大于零的整数,也就是10^(-n)的误差。

取到小数点后n位,wtm直接带入!(为什么我要绕个圈子呢?因为指数符号后面只能带一个符号,而 -n 不会把n带上,就很难受)

%5Cfrac%7BN_%7B0%7D'%5E2%20%2BN%20%7D%7B2N_%7B0%7D'%5Csqrt%7BN%7D%20%20%7D%20%3D1%2B10%5Et

解得%5Csqrt%7BN%7D%3DN_%7B0%7D'%20%20%5B(1%2B10%5Et)%2B%5Csqrt%7B(1%2B10%5Et)%5E2-1%7D%20%5D

极限条件下,令N%5Crightarrow%20N_%7B1%7D%20,有%5Csqrt%7B%5Cfrac%7BN_%7B1%7D%20%7D%7BN_%7B0%7D%20%7D%20%7D%3D(1%2B10%5Et)%2B%5Csqrt%7B(1%2B10%5Et)%5E2-1%7D%20

代入%5Cfrac%7BN_%7B1%7D-N_%7B0%7D%7D%7BN_%7B0%7D%7D%20%3D%5Cfrac%7B2%5Csqrt%7BN_%7B0%7D%7D%20%2B1%7D%7BN_%7B0%7D%7D%20%3D%5Cfrac%7B2%7D%7B%5Csqrt%7BN_%7B0%7D%7D%7D%2B%20%5Cfrac%7B1%7D%7BN_%7B0%7D%7D%20%20中,有%5Cfrac%7B1%7D%7B%5Csqrt%7BN_%7B0%7D%7D%20%7D%20%20%2B1%3D%5Csqrt%7B%5Cfrac%7BN_%7B1%7D%20%7D%7BN_%7B0%7D%7D%20%7D%20%3D(1%2B10%5Et)%2B%5Csqrt%7B(1%2B10%5Et)%5E2-1%7D%20

得到N_%7B0%7D%3D(%5Cfrac%7B1%7D%7B10%5Et%2B%5Csqrt%7B(1%2B10%5Et)%5E2-1%7D%20%7D%20)%5E2

则在精度10^(-n),即取小数点后n位的要求下,

开方数N%5Cgeq%20N_%7B0%7D%3D(%5Cfrac%7B1%7D%7B10%5Et%2B%5Csqrt%7B(1%2B10%5Et)%5E2-1%7D%20%7D%20)%5E2,

或者说%5Csqrt%7BN%7D%20%5Cgeq%20N_%7B0%7D'%3D%5Cfrac%7B1%7D%7B10%5Et%2B%5Csqrt%7B(1%2B10%5Et)%5E2-1%7D%20%7D%20

其中t=-n,n为大于0的整数。

很好,最重要的工作已经完成,现在就是需要代入具体的数字来一波演算(懒得算,直接给结果)。

n=2时,N_%7B0%7D%E2%80%98%3D6.59,取7,和上面的结论是一致的。

n=3时,N_%7B0%7D%E2%80%99%3D21.87,取22

现在你想要的精度你可以直接得到了,有意思吧

至于开立方么,我这写完平方之后就没写下去了,估计感觉烦了就不写了吧。但是我应该可以给出一个好的“指导”:

%5Csqrt%7BN%7D%20%3Dx%2B%CE%94x%20%3D%5Csqrt%7Bx%5E3%2B3x%5E2%CE%94x%2B3x%CE%94x%5E2%2B%CE%94x%5E3%7D%E2%89%88%5Csqrt%7Bx%5E3%2B3x%5E2%CE%94x%7D

x是开立方的整数,%CE%94x%3D%5Cfrac%7BN-x%5E3%7D%7B3x%5E2%7D%20,则估算值就是%5Csqrt%5B3%5D%7BN%7D%20%E2%89%88%5B%5Csqrt%5B3%5D%7BN%7D%20%5D%2B%5Cfrac%7BN-x%5E3%7D%7B3x%5E2%7D%20%3Dx%2B%5Cfrac%7BN-x%5E3%7D%7B3x%5E2%7D%20

如果是开k次方呢?简单!

%5Csqrt%5Bk%5D%7BN%7D%20%E2%89%88N_%7B0%7D'%2B(N-N_%7B0%7D%5Ek)/[kN_%7B0%7D^(k-1)]   (还是和上面一样的问题,我搞不来啊!)

在开k次方的情况下要求误差小于10%5Et(t=-n,n为正整数)呢?简单!

直接取极限条件,令N%3DN_%7B1%7D%20,化简可得:

不想打字,累

可见,我们得到了一个一元k次方程,有亿点难度......

我的某个m开头数学软件罢工了,表示算不出来,那算了,我这里探讨一下解的存在性问题。

F(%CE%B1)%3D%CE%B1%5Ek%2B(1%2B10%5Et)k%CE%B1%2Bk-1

导一下,并令导数为0,解得:%CE%B1%3D%5Csqrt%5Bk-1%5D%7B1%2B10%5Et%7D%20

如果观察导函数,会发现这应该是个单调递增有零点的函数,显然:

F(%CE%B1)_%7Bmin%7D%20%3DF(%5Csqrt%5Bk-1%5D%7B1%2B10%5Et%7D%20)%3D%5B(1%2B10%5Et)%5E%5Cfrac%7Bk%7D%7Bk-1%7D%20-1%5D(1-k)

由于题设k为正整数,所以一定有F(%CE%B1)_%7Bmin%7D%3C0

又有F(0)%3Dk-1%3E0 以及 F(%E2%88%9E)%3D%E2%88%9E,所以得到结论:F(%CE%B1)%3D0至少有两个不同的实数解。考虑到导函数的单调性,得到最终结论:F(%CE%B1)%3D0有且仅有两个不同的实数解。(当然,我这里并不想考虑复数解的存在的意义)。这一结论与前面的推导是一致的。值得注意的是,由于α>1,所以解一定取的是右边的那个解。

所以,解是肯定存在的,但是我算不出来而已。

那我就束手无策了吗?

大错特错!我不是还有python吗!!!!

编程目的:找到一个整数N,使得在使用快速开方法后满足误差在10^-n以内而整数N-1不满足。

核心思想:上面提到的算式。

输入有:开方根次k,误差度n。

以上就是代码,但是有一个问题:经过试验,当你输入的n和k稍微大一点点的时候,10000的循环上线就不够用了,你要是加大数量的话,那必然运行半年都出不来。

突然想到,这个结果是满足单调性的,因为只要满足了某一个值,那么后面的值都会满足,那么这个可以用二分枚举啊!好!来!(我不是学计算机,也不是专门学算法的,如果名字叫错了请见谅)

完成辣!但是有一个小毛病,我遇到一点bug:开二次根号任意精度都不会出问题,但是只要开三次根号就出问题,没有输出,我也不知道是为什么。

我去,从10:30码字到14:32(中间吃了个饭,代码也是现码的),整整四个小时的跨度,真刺激,午睡去了。

开根号的小妙招的评论 (共 条)

分享到微博请遵守国家法律