|
|

楼主 |
发表于 2011-12-27 15:19
|
显示全部楼层
[原创]大整数的开方
最新补充版
大整数用竖式开方,比迭代法好,不知是否可编称,用到公式:(a+b+c+d+……)^2=a^2+b(b+2a)+c(c+2a+2b)+d(d+2a+2b+2c)+……
举例:12345671 11111111 11111111先分段,每段必须是偶数位,最高位开方是3513(取整数),余数为4502(也可两位两位开),最后的余数与下一段并在一起得450211111111,除以3513*20000=70260000,商=6047,取余时减数为6047*(6047+3513*20000),余数为14241462,再和下一段并一起1424146211111111,除以35136047*20000,商=2026,则方根整数部分为351360472026,注意商的位数必须全满,不够则在高位添零,如商若为7,则写作0007,
如果余数段位多,可以按大整数的除法算,继续分段,
由于商为整段的(商若超过1段,说明前面的计算错了,商小了),除数和被除数可同时去掉相同位数再算,这样的商也是正确的,
余数过大是商小了,商+1=商,再试,商大了,被除数不够减,商-1=商再试,商过小的判断,余数>方根的2倍则商小了,余数>=方根的2倍是对的,商小了还有可能是商位数没写够,如0007写做7,中间段和末尾均可补0,均须补整段的0,没有半段的,半段的是商末尾为0造成的,如8000等,
判断方根是否正确:最后余数应该小于或等于方根的整数部分的2倍,且方根(取整数)的平方小于原数,方根(取整数)加1的平方大于原数。
例,求6958000001674999998647的方根?
令M=6958 000001 674999 998647,是22位,6位1段分段,最高段方根为83,余数为6958-83*83=6958-6889=69,
83*2000=166000,69 000001/166000=415,166415*415=69062225,大于被除数,所以用69000001-166414*414=69000001-68895396=104605为余数,
83 414*2000=166828000,104605 674999/166828000,数据过长,被除数和除数末尾同时去掉3位,104605674/166828=627,104605 674999-166828627*627=104605674999-104601549129=4125870,
83 414 627*2000=166829254,4125870 998647/166829254000,数据过长,被除数和除数末尾同时去掉3位,4125870 998/166829254=24,(注意商的位数不够补0为024),余数4125870 998647-24*166829254024=121968902071,所以方根为83 414 627 024,要检验是否正确,
数据过长,被除数和除数末尾去掉的位数不能太多,计算机不溢出就行,太多了商会不准确,一般会稍大,如:
104605 674999/166828000,数据过长,被除数和除数末尾同时去掉3位,104605674/166828=627,
被除数和除数末尾同时去掉6位,104605/166=630,过大,要用条件语句,和”商=商-1“循环试商,
也可以这样处理,除数=除数+1,再试商,166+1=167,104605/167=626.3772,上取整得626+1=627,有的还要小,要用条件语句和”商=商+1“循环试商,
例:14585113/997=14629,1458511/99=14732,过大14732-14629=103,1458511/100=14585,过小14629-14585=44,平均(14732+14585)/2=14658,
145851/9=16205,过大16205-14629=1576,145851/10=14585,过小14629-14585=44,平均(16205+14585)/2=15395,
104605674/166828=627,10460/16=653,过大653-627=26,10460/17=615,过小627-615=12,平均(653+615)/2=634,
还可以参考《大整数的除法及求余》的作法,这样做:104605/166=630,104605-630*166=25,25674-630*828=-495966,-495966/828=598,(630+599)/2=614,
可见,去掉位数过多,不易找到准确的商,为了程序简便,可以直接用条件语句,商=商-1,或商=商+1,循环试商,循环次数不能过多,一般不超过商的1/2,如630/2=315,
超过次数就是前面程序出错,商必为1段,超过1段就是前面程序出错,要找出错误重新编程,
还可以这样:把最高位段开方,后被开方数增加1个段位,商加1个段位的9,把商的两个段位的平方,与被开方数的前2个段位比较,若大了,把商的末尾段位减小1/2,就是迭代法,若小了再加剩下的1/2,大了再减剩下的1/2,依次1段段向后算,直到算完!除了最高段,中间的段位必须数字占满,可以写0007这样的数,由于每次必须把方根所有位数乘方,计算量大,浪费资源,大数据不行,用竖式法好。
大整数的乘除开平方运算,分段位数是,每段小于等于计算机处理位数的1/3,开平方每段必须是偶数位数,加减运算段位位数可以是小于等于计算机处理位数的1/2,这样不会溢出。
|
|