Postgresql 简化SQL中的for循环函数

Postgresql 简化SQL中的for循环函数,postgresql,math,Postgresql,Math,我已将以下函数翻译成PostgreSQL: function probBlock(A,C){ var invB=1.0; var C=Math.floor(C); var count=0.0; for (k=1;k<=C;k++){ count++; invB=1.0+(count*invB)/A; } var blockProb=1.0/invB; return blockPro

我已将以下函数翻译成PostgreSQL:

function probBlock(A,C){
    var invB=1.0;
    var C=Math.floor(C);
    var count=0.0;
    for (k=1;k<=C;k++){
        count++;        
        invB=1.0+(count*invB)/A;
    }   
    var blockProb=1.0/invB;
    return blockProb
}

我希望简化函数
probBlock
的原因是,在PostgreSQL中的
ErlangOfferedLoad(gos,c)
上运行一次,需要1分钟,这是完全不可接受的

我不认为可以将复杂度降低到O(1),但如果用C编写SQL函数,速度会快几个数量级。@LaurenzAlbe因为输入A和C都是标量,我只希望将多项式组合成一个或两个元素(可能像几何序列?),这样复杂度可以非常接近
O(1)
function erlangbOfferedLoad(gos,c) {
    var a=c;
    var check=probBlock(a,c);
    while (check>gos) {
        a=a/2;
        check=probBlock(a,c);
    }
    while (check<gos) {
        a=a*2;
        check=probBlock(a,c);
    }
    var fraction=1e-7;
    var step=a;
    var gosCalc=probBlock(a,c);
    var diffError=gos-gosCalc;
    if (diffError<0){
        step=a/2;
        a=a/2;
    }
    while (Math.abs(diffError)>(gos*fraction)){
        step=step*0.75;
        var prevA=a;
        a=a+(step*(diffError>0))-(step*(diffError<0));
        if (a<0){
            a=prevA/2;
        }
        gosCalc=probBlock(a,c);
        diffError=gos-gosCalc;
    }
    return a
}