BC开方(乙)

Wesley13
• 阅读 493
function bcroot($幂, $指 = '3', $scale = 0){
    #开方
    $d = false;
    if($幂 == '0'){
        return '0';
    }elseif($幂 == '1'){
        return '1';
    }

    $指数 = intval($指);
    $底扩位数 = $scale;
    $幂扩位数 = $指数 * $底扩位数;

    $幂 = bcmul($幂,str_pad('1',$幂扩位数+1,'0'));

    $小数点位 = strpos($幂,'.');
    if($小数点位 !== FALSE){
        $幂 = substr($幂,0,$小数点位);
    }

    $幂长 = strlen($幂);
    $底数长 = ceil($幂长 / $指数);

    #初次逆序
    $幂 = strrev($幂);
    $幂段 = array_reverse(str_split($幂,$指数));
    $底数 = '';
    $小余 = '0';
    foreach($幂段 as $小幂){
        #再次逆序,则正过来
        $小幂 = strrev($小幂);

        # (底 . 小底)^指数  - 小底^指数 <= 小余 . 小幂

        if($小余 != '0'){
            $此幂 = $小余.$小幂;
        }else{
            $此幂 = $小幂;
        }

        $小余 = '0';

        $小底 = '1';
        ${'试幂'.$小底} = bcpow_sub($底数,$小底,$指);
        $比较 = bccomp(${'试幂'.$小底},$此幂);
        if($比较 == '1'){
            # x<1
            $小底 = '0';
            $小余 = $此幂;
        }else{
            # 1<x
            $小底 = '9';
            ${'试幂'.$小底} = bcpow_sub($底数,$小底,$指);
            $比较 = bccomp(${'试幂'.$小底},$此幂);
            if($比较 == '-1'){
                # 9<x
                $小底 = '9';
                $小余 = bcsub($此幂,${'试幂'.$小底});
            }else{
                # 1<x<9
                $小底 = '5';
                ${'试幂'.$小底} = bcpow_sub($底数,$小底,$指);
                $比较 = bccomp(${'试幂'.$小底},$此幂);
                if($比较 == '1'){
                    # 1<x<5
                    $小底 = '3';
                    ${'试幂'.$小底} = bcpow_sub($底数,$小底,$指);
                    $比较 = bccomp(${'试幂'.$小底},$此幂);
                    if($比较 == '1'){
                        # 1<x<3
                        $小底 = '2';
                        ${'试幂'.$小底} = bcpow_sub($底数,$小底,$指);
                        $比较 = bccomp(${'试幂'.$小底},$此幂);
                        if($比较 == '1'){
                            # 1<x<2
                            $小底 = '1';
                            $小余 = bcsub($此幂,${'试幂'.$小底});
                        }else{
                            # 2<x<3
                            $小底 = '2';
                            $小余 = bcsub($此幂,${'试幂'.$小底});
                        }
                    }else{
                        # 3<x<5
                        $小底 = '4';
                        ${'试幂'.$小底} = bcpow_sub($底数,$小底,$指);
                        $比较 = bccomp(${'试幂'.$小底},$此幂);
                        if($比较 == '1'){
                            # 3<x<4
                            $小底 = '3';
                            $小余 = bcsub($此幂,${'试幂'.$小底});
                        }else{
                            # 4<x<5
                            $小底 = '4';
                            $小余 = bcsub($此幂,${'试幂'.$小底});
                        }
                    }
                }else{
                    # 5<x<9
                    $小底 = '7';
                    ${'试幂'.$小底} = bcpow_sub($底数,$小底,$指);
                    $比较 = bccomp(${'试幂'.$小底},$此幂);
                    if($比较 == '1'){
                        # 5<x<7
                        $小底 = '6';
                        ${'试幂'.$小底} = bcpow_sub($底数,$小底,$指);
                        $比较 = bccomp(${'试幂'.$小底},$此幂);
                        if($比较 == '1'){
                            # 5<x<6
                            $小底 = '5';
                            $小余 = bcsub($此幂,${'试幂'.$小底});
                        }else{
                            # 6<x<7
                            $小底 = '6';
                            $小余 = bcsub($此幂,${'试幂'.$小底});
                        }
                    }else{
                        # 7<x<9
                        $小底 = '8';
                        ${'试幂'.$小底} = bcpow_sub($底数,$小底,$指);
                        $比较 = bccomp(${'试幂'.$小底},$此幂);
                        if($比较 == '1'){
                            # 7<x<8
                            $小底 = '7';
                            $小余 = bcsub($此幂,${'试幂'.$小底});
                        }else{
                            # 8<x<9
                            $小底 = '8';
                            $小余 = bcsub($此幂,${'试幂'.$小底});
                        }
                    }
                }
            }
        }
        $底数 .= $小底;
    }

    $底数 = bcdiv($底数,str_pad('1',$底扩位数+1,'0'),$scale);
    return $底数;
}

function bcpow_sub($底,$小底,$指){
    if($底 == '0' or $底 == ''){
        return bcpow($小底,$指);
    }else{
        return bcsub(bcpow($底 . $小底,$指),bcpow($底 .'0',$指));
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
我是阿沐 我是阿沐
2年前
高并发下如何保证接口的幂等性?
1前言大家好,我是阿沐!”幂等“这个词语或许小伙伴很少见,基本上中小型公司或者一些大公司都未使用过,但是并不代表小伙伴们没有接触到。为啥我会扯到这个技术话题?缘由就是20年我面试了一些大厂包括身边朋友的面试经历,例如腾讯、网易、字节等等大厂,其中大都会遇到”幂等的概念、理解以及实现与应用“,那么下面就听我一一道来幂等的相关知识。2什么是幂等性?数学中:
Wesley13 Wesley13
2年前
Java笔试题库之选题题篇【1
1.下面中哪两个可以在A的子类中使用:()  classA{    protectedintmethod1(inta,intb){      return0;    }  }A.publicintmethod1(inta,intb){return0;}B.privateintme
Wesley13 Wesley13
2年前
HTTP 的幂等性
本文主要以HTTPGET、DELETE、PUT、POST四种方法为主进行语义和幂等性的介绍。一、HTTP的幂等性HTTPGET方法用于获取资源,不应有副作用,所以是幂等的。比如:GEThttp://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,
Stella981 Stella981
2年前
Kafka设计
1.幂等消息为了解决重试导致的消息重复、乱序问题,kafka引入了幂等消息。幂等消息保证producer在一次会话内写入一个partition内的消息具有幂等性,可以通过重试来确保消息发布的ExactlyOnce语义。实现逻辑很简单:区分producer会话producer每次启动后,首先向broker申请一
Wesley13 Wesley13
2年前
JS中有趣的知识
1.分号与换行functionfn1(){return{name:'javascript'};}functionfn2(){return{name:'javascript'
Stella981 Stella981
2年前
Kafka Exactly
!(https://oscimg.oschina.net/oscnet/0001a9db0c7346a6b32db4586329cae6.png)作者|王蒙整理|无风我起浪这篇文章主要讲述Kafka事务性的实现,这部分的实现要比幂等性的实现复杂一些,幂等性实现是事务性实现的基础,幂等性提供了单会话单Partiti
Stella981 Stella981
2年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
2年前
SpringBoot接口幂等性实现的4种方案!
!(https://oscimg.oschina.net/oscnet/42a233a0deb143899955ec0d6d7805c6.jpg)作者|超级小豆丁来源|www.mydlq.club/article/94目录什么是幂等性什么是接口幂等性为什么需要实现幂等性
Easter79 Easter79
2年前
SpringBoot接口幂等性实现的4种方案!
!(https://oscimg.oschina.net/oscnet/42a233a0deb143899955ec0d6d7805c6.jpg)作者|超级小豆丁来源|www.mydlq.club/article/94目录什么是幂等性什么是接口幂等性为什么需要实现幂等性