如何调用GMP大数库中的开N次方函数mpz_root()

这个函数原型mpz_root(mpz_t rop,mpz_t op,unsigned long int n),它只提供N次根整数部分,这个函数在PDF文件中并没有注明传参的要求(也许是我没查到),即使是正整数不进行一些处理也得不到正确答案,如果要对小数开方,和需要更高的精度,也需要一些前期和后期的处理,因为我曾写过手工开N次方程序,昨天经过调试,发现两个函数前后处理大致一样,方法如下:
  例:对1.23456789123456789E12开9次方,精度9
如果是科学计数法表示的数,如:1.23456789123456789E12,转换成 1234567891234.56789
把数以小数点位置向左和向右分别分成N整数倍的段,这个例子转换成:000001234 567891234 567890000
这个函数有个特点,如果你需要M精度的数,你需要传M*N长的数,如果数没有这么长,后面补零,这个例子你需要传:
000001234 567891234 567890000 000000000 000000000 000000000 000000000 000000000 000000000

函数返回后小数点的位置为:经过前期整理后的数,它的小数点左方的位数,除以N,这里是18\9=2,返回结果为220547258,加小数点后为22.0547258


因为这个函数的传参特殊性,当开方次数较高,或要求精度较高时,出现堆栈空间溢出错误,增大堆栈空间也不行(也可能操作不对),目前10000精度可以提供开51次方正确运算,用时7.8秒,实际开方次数还可大一点,
所以当开方次数要求较大时,我用mpz_root()函数计算20位初值(我自已写的初值程序没有优化,特慢),再用我自已写的迭代式计算,10000精度开51次方正确运算,用时4.8秒,竟比GMP的还要快些,然后我减少开方数测试,一直到开25次方时,GMP胜出,mpz_root()10000精度开25次方正确运算,用时2.9秒,注:测试被开方数为999999999
运用两者合作的方式,可以开25500次方,10000精度,被开方数为999999999,用时28.5秒。(为什么用25500开方,因为再大,mpz_root()函数就快停工了,只有减少初值位数,它才能提供更高次的开方)
开25500次方,10000精度,被开方数为111111111,用时8.8秒,这里被开方数是9位,实际参入运算的大都是一万位,即使用一万位被开方数,用时也在这附近,而且规律特乱。最高时用时70多秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值