使用Python手工计算x的算数平方根,来自中国古人的数学智慧

代码

sqrt(x, w=20, Float=False)
x 为非负实数,允许科学计数法
w 是当sqrt(x)为无理数或结果的小数部分很长时的最大位数。默认w=20
Float 当Float=True输出浮点数,w设置如超出float精度则失效。默认输出字符串类型

def sqrt(x,w=20,Float=False):
    if x==0 or x==1:return str(x*1.0)
    if x<0: raise ValueError('x>=0')
    s,power = str(x),0
    t = s.find('e')
    if t!=-1:
        s=s.split('e')
        s[1] = int(s[1])
        if int(s[1])%2:
            tmp = str(s[0])
            s = [tmp[0]+tmp[2]+tmp[1]+tmp[3:],s[1]-1]
        s,power = *s,
    t = s.find('.')
    if t!=-1:
        if t%2: s='0'+s
        if not len(s)%2: s+='0'
    else:
        if len(s)%2: s='0'+s
    s = s.split('.')
    t = t,len(s[0])//2
    try: s = s[0]+s[1]
    except: s = s[0]
    s = [s[i:i+2] for i in range(len(s)) if not i%2][::-1]
    n = int(s.pop())
    i = 1
    while n>0 and i*i<=n: i+=1
    i -= 1
    m,n = str(n-i*i),i
    div = lambda x,y:[(i,y-(20*x+i)*i) for i in range(10) if y>=(20*x+i)*i]
    dot,ret = t[1],str(n)
    while w>0:
        dot -= 1;
        if dot==0: ret += '.'
        if dot<=0: w-=1
        m += s.pop() if s else '00'
        q,d = div(n,int(m))[-1]
        m,n = str(d),10*n+q
        ret += str(q)
        if len(s)==0 and d==0:
            if ret.find('.')==-1: ret += '.0'
            break
    if power!=0:
        if power>0: ret += 'e+0'+str(power//2)
        else: ret += 'e-0'+str(power//2)[1:]
    if Float: ret = float(ret)
    return ret

原理

据说这个平方根计算法出自《九章算术》,成书在公元一世纪前后,总结了先秦到两汉的古代数学成就。古代数学家也真是鬼才,怎么想出来的?

操作过程:

小数点前后2位2位的隔开,不足2位用0补。然后首位试开方,第二位开始反复用公式 (Qn+1 * 20 + Qn) * Qn来试商 ; 下一结果Qn+2 = 10*Qn+1 + Qn。具体流程请自行搜索了解,大致流程如下:

测试 sqrt(n)与n**0.5

>>> for i in range(17):
	print(f'sqrt({i})={sqrt(i)}')
	print(f'{i}**0.5={i**0.5}')
sqrt(0)=0.0
0**0.5=0.0
sqrt(1)=1.0
1**0.5=1.0
sqrt(2)=1.41421356237309504880
2**0.5=1.4142135623730951
sqrt(3)=1.73205080756887729352
3**0.5=1.7320508075688772
sqrt(4)=2.0
4**0.5=2.0
sqrt(5)=2.23606797749978969640
5**0.5=2.23606797749979
sqrt(6)=2.44948974278317809819
6**0.5=2.449489742783178
sqrt(7)=2.64575131106459059050
7**0.5=2.6457513110645907
sqrt(8)=2.82842712474619009760
8**0.5=2.8284271247461903
sqrt(9)=3.0
9**0.5=3.0
sqrt(10)=3.16227766016837933199
10**0.5=3.1622776601683795
sqrt(11)=3.31662479035539984911
11**0.5=3.3166247903554
sqrt(12)=3.46410161513775458705
12**0.5=3.4641016151377544
sqrt(13)=3.60555127546398929311
13**0.5=3.605551275463989
sqrt(14)=3.74165738677394138558
14**0.5=3.7416573867739413
sqrt(15)=3.87298334620741688517
15**0.5=3.872983346207417
sqrt(16)=4.0
16**0.5=4.0
>>>
>>>
>>> sqrt(2,Float=True) == 2**0.5
True
>>> sqrt(3,Float=True) == 3**0.5
True
>>> sqrt(123,Float=True) == 123**0.5
True
>>> 

科学计算法测试

>>> sqrt(1.23e+50)
'1.10905365064094171620e+025'
>>> 1.23e+50**0.5
1.1090536506409416e+25
>>> sqrt(1.23e+51)
'3.50713558335003638336e+025'
>>> 1.23e+51**0.5
3.5071355833500364e+25
>>> sqrt(1.23e-50)
'1.10905365064094171620e-025'
>>> 1.23e-50**0.5
1.1090536506409418e-25
>>> sqrt(1.23e-51)
'3.50713558335003638336e-026'
>>> 1.23e-51**0.5
3.5071355833500365e-26
>>> 

精度测试

>>> sqrt(2,100)
'1.41421356237309504880168872420969807856967187537694
80731766797379907324784621070388503875343276415727'
>>> sqrt(10,500)
'3.16227766016837933199889354443271853371955513932521
68268575048527925944386392382213442481083793002951
87347284152840055148548856030453880014690519596700
15390334492165717925994065915015347411333948412408
53169295770904715764610443692578790620378086099418
28371711548406328552999118596824564203326961604691
31433612894979189026652954361267617878135006138818
62785804636831349524780311437693346719738195131856
78403231241795402218308045872844614600253577579702
82864402902440797789603454398916334922265261206779'
>>> sqrt(123,2000)
'11.09053650640941716205160010260993291846337674245402
00228773128390850016331012896052334560795952104923
97609680678955280792187905933115292625456231839306
77251943912251383176574941199469582196976000438135
40867472202696805822192936674286399297485980945076
78295660716567970352602444301464684924479636459099
14867193001802834979182445692668356613065880869548
25999929108256938950212808340223106891096223696155
58407975630369894453553840958193501976809032496435
98351605065147790119568667920441106521130541775416
88403618227856731042118992185281429619080341919784
91236339758444278806715795552342614568993355758259
00257454016962686033789212494918951906742724387717
86816775058970553110606825772728456503631816127185
97236514403953501043370950197906664648656587402375
47456007486620199478701365589929806411967684259454
52983826062182085142259698311212942126801021825240
49746216571370198706996668818361845968235199845816
69902568378075870406180767774203205467306930309438
16832697339952984981648138573158982379175644441470
50866454616067044997958059525209028336061119869487
42330123683852090419874148218422184948658174234109
57266920859313915279433828848348895422861007776818
60008218306382698626583716405660864687800252861028
31434598682004467042622580768146827595778429365752
19552960734589394860581552514632178318401717998004
12904477515916582731378709757426533231624676879051
21277303475419893966421915682962327965202183939540
07041575389626966661084388718863067485822881867488
00698329255619212758441301451712107894934052042668
13620261632356745839351541875140890682676375675084
74266141686980135645708807796240849684849035273656
15026469136389861472142022294507047846522584450886
83823021978858519029304962564972861464819539784518
43062402845984165814550404820570869649363216162428
32571582506529019502195720558586845830492641836612
65156560044594234298289454649568716622838760718998
14917847213523793754337786561375901264942957378010
57481468928695787589958271831183026476218342365982
72020291818311722410861264031411990033164594115086'
>>> 

1000位到1万位的耗时测试

>>> from time import time
>>> for i in range(1,11):
	t = time()
	s = sqrt(2,i*1000)
	print(i*1000,':',time()-t)
1000 : 0.09099745750427246
2000 : 0.5609970092773438
3000 : 1.7489948272705078
4000 : 3.7850000858306885
5000 : 7.239997863769531
6000 : 12.108997106552124
7000 : 19.044997692108154
8000 : 28.065003395080566
9000 : 39.57198643684387
10000 : 54.04999876022339
>>> 

以上就是使用Python手工计算x的算数平方根,更多关于Python手工计算x的算数平方根的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python基于二分查找实现求整数平方根的方法

    本文实例讲述了Python基于二分查找实现求整数平方根的方法.分享给大家供大家参考,具体如下: x=int(raw_input('please input a int:')) if x<0: retrun -1 low=0 high=x ans=(low+high)/2.0 sign=ans while ans**2 !=x: if ans**2>x: high=ans else: low=ans ans=(low+high)/2.0 if sign==ans: break print ans

  • Python求算数平方根和约数的方法汇总

    一.求算术平方根 a= x=int(raw_input('Enter a number:')) if x >= : while a*a < x: a = a + if a*a != x: print x,'is not a perfect square' else: print a else: print x,'is a negative number' 二.求约数 方法一: divisor = [ ] x=int(raw_input('Enter a number:')) i= while

  • python开根号实例讲解

    平方根,又叫二次方根,表示为[√ ̄],如:数学语言为:√ ̄16=4.语言描述为:根号下16=4. 以下实例为通过用户输入一个数字,并计算这个数字的平方根: 例如 num = float(input('请输入一个数字: ')) num_sqrt = num ** 0.5 print(' %0.3f 的平方根为 %0.3f'%(num ,num_sqrt)) 以上代码输出结果为 请输入一个数字: 4 4.000 的平方根为 2.000 在该实例中,我们通过用户输入一个数字,并使用指数运算符 ** 来

  • Python中利用sqrt()方法进行平方根计算的教程

    sqrt()方法返回x的平方根(x>0). 语法 以下是sqrt()方法的语法: import math math.sqrt( x ) 注意:此函数是无法直接访问的,所以我们需要导入math模块,然后需要用math的静态对象来调用这个函数. 参数 x -- 这是一个数值表达式. 返回值 此方法返回x的平方根,对于x>0. 例子 下面的例子显示了sqrt()方法的使用. #!/usr/bin/python import math # This will import math module pr

  • Python求解平方根的方法

    本文实例讲述了Python求解平方根的方法.分享给大家供大家参考.具体如下: 主要通过SICP的内容改写而来.基于newton method求解平方根.代码如下: #!/usr/bin/python def sqrt_iter(guess,x): if(good_enough(guess, x)): print guess else: sqrt_iter(improve(guess, x),x) def improve(guess, x): return average(guess, x/gue

  • 使用Python手工计算x的算数平方根,来自中国古人的数学智慧

    代码 sqrt(x, w=20, Float=False) x 为非负实数,允许科学计数法 w 是当sqrt(x)为无理数或结果的小数部分很长时的最大位数.默认w=20 Float 当Float=True输出浮点数,w设置如超出float精度则失效.默认输出字符串类型 def sqrt(x,w=20,Float=False): if x==0 or x==1:return str(x*1.0) if x<0: raise ValueError('x>=0') s,power = str(x),

  • Python实现计算圆周率π的值到任意位的方法示例

    本文实例讲述了Python实现计算圆周率π的值到任意位的方法.分享给大家供大家参考,具体如下: 一.需求分析 输入想要计算到小数点后的位数,计算圆周率π的值. 二.算法:马青公式 π/4=4arctan1/5-arctan1/239 这个公式由英国天文学教授约翰·马青于1706年发现.他利用这个公式计算到了100位的圆周率.马青公式每计算一项可以得到1.4位的十进制精度.因为它的计算过程中被乘数和被除数都不大于长整数,所以可以很容易地在计算机上编程实现. 三.python语言编写出求圆周率到任意

  • 实现用python算法计算圆周率的小诀窍

    目录 一.圆周率的历史 1.中国 2.印度 3.欧洲 二.用python计算圆周率π [方法] [程序设计思路] [软件环境] [代码] [结果展示] [常见问题答疑] 一.圆周率的历史 1.中国 魏晋时期,刘徽曾用使正多边形的边数逐渐增加去逼近圆周的方法 (即「割圆术」),求得π的近似值3.1416. 汉朝时,张衡得出π的平方除以16等于5/8,即π等于10的开方(约为3.162).虽然这个值不太准确,但它简单易理解,所以也在亚洲风行了一阵. 王蕃(229-267)发现了另一个圆周率值,这就是

  • Python科学计算之NumPy入门教程

    前言 NumPy是Python用于处理大型矩阵的一个速度极快的数学库.它允许你在Python中做向量和矩阵的运算,而且很多底层的函数都是用C写的,你将获得在普通Python中无法达到的运行速度.这是由于矩阵中每个元素的数据类型都是一样的,这也就减少了运算过程中的类型检测. 矩阵基础 在 numpy 包中我们用数组来表示向量,矩阵和高阶数据结构.他们就由数组构成,一维就用一个数组表示,二维就是数组中包含数组表示. 创建 # coding: utf-8 import numpy as np a =

  • python实现计算资源图标crc值的方法

    本文实例讲述了python实现计算资源图标crc值的方法,分享给大家供大家参考.具体方法如下: 实现该功能的关键在于解析资源信息,找到icon的数据,然后计算这些数据的crc 具体实现代码如下: def _get_iconcrc(self, file_path): """ Generates the crc32 hash of the icon of the file. @return: str, the str value of the file's icon "

  • Python简单计算文件夹大小的方法

    本文实例讲述了Python简单计算文件夹大小的方法.分享给大家供大家参考.具体如下: import os, re """ 查看文件夹下的所有文件及文件夹 join为拼接函数 """ def Look_File(path): for root , dirs, files in os.walk(path, True): print root #主目录 for item in files: #主目录下的文件夹 print os.path.join(ro

  • Python实现计算两个时间之间相差天数的方法

    本文实例讲述了Python实现计算两个时间之间相差天数的方法.分享给大家供大家参考,具体如下: #-*- encoding:UTF-8 -*- from datetime import date import time nowtime = date.today() def convertstringtodate(stringtime): "把字符串类型转换为date类型" if stringtime[0:2] == "20": year=stringtime[0:4

  • python实现计算倒数的方法

    本文实例讲述了python实现计算倒数的方法.分享给大家供大家参考.具体如下: class Expr: def __add__(self, other): return Plus(self, other) def __mul__(self, other): return Times(self, other) class Int(Expr): def __init__(self, n): self.n = n def d(self, v): return Int(0) def __str__(se

  • Python简单计算数组元素平均值的方法示例

    本文实例讲述了Python简单计算数组元素平均值的方法.分享给大家供大家参考,具体如下: Python 环境:Python 2.7.12 x64 IDE :     Wing IDE Professional  5.1.12-1 题目:  求数组元素的平均值 实现代码: # coding:utf-8 #求数组元素的平均值 a=[1,4,8,10,12] b=len(a) sum=0 print "我们测试结果:" print "数组长度为:",b for i in

  • Python科学计算包numpy用法实例详解

    本文实例讲述了Python科学计算包numpy用法.分享给大家供大家参考,具体如下: 1 数据结构 numpy使用一种称为ndarray的类似Matlab的矩阵式数据结构管理数据,比python的列表和标准库的array类更为强大,处理数据更为方便. 1.1 数组的生成 在numpy中,生成数组需要指定数据类型,默认是int32,即整数,可以通过dtype参数来指定,一般用到的有int32.bool.float32.uint32.complex,分别代表整数.布尔值.浮点型.无符号整数和复数 一

随机推荐