// File: mouda[P]LTE_random_access-simulate/specialfunctions.cpp
// Function: alglib_impl::psi(double, alglib_impl::ae_state*)
double psi(double x, ae_state *_state)
{
    double p;
    double q;
    double nz;
    double s;
    double w;
    double y;
    double z;
    double polv;
    ae_int_t i;
    ae_int_t n;
    ae_int_t negative;
    double result;


    negative = 0;
    nz = 0.0;
    if( ae_fp_less_eq(x,0) )
    {
        negative = 1;
        q = x;
        p = ae_ifloor(q, _state);
        if( ae_fp_eq(p,q) )
        {
            ae_assert(ae_false, "Singularity in Psi(x)", _state);
            result = ae_maxrealnumber;
            return result;
        }
        nz = q-p;
        if( ae_fp_neq(nz,0.5) )
        {
            if( ae_fp_greater(nz,0.5) )
            {
                p = p+1.0;
                nz = q-p;
            }
            nz = ae_pi/ae_tan(ae_pi*nz, _state);
        }
        else
        {
            nz = 0.0;
        }
        x = 1.0-x;
    }
    if( ae_fp_less_eq(x,10.0)&&ae_fp_eq(x,ae_ifloor(x, _state)) )
    {
        y = 0.0;
        n = ae_ifloor(x, _state);
        for(i=1; i<=n-1; i++)
        {
            w = i;
            y = y+1.0/w;
        }
        y = y-0.57721566490153286061;
    }
    else
    {
        s = x;
        w = 0.0;
        while(ae_fp_less(s,10.0))
        {
            w = w+1.0/s;
            s = s+1.0;
        }
        if( ae_fp_less(s,1.0E17) )
        {
            z = 1.0/(s*s);
            polv = 8.33333333333333333333E-2;
            polv = polv*z-2.10927960927960927961E-2;
            polv = polv*z+7.57575757575757575758E-3;
            polv = polv*z-4.16666666666666666667E-3;
            polv = polv*z+3.96825396825396825397E-3;
            polv = polv*z-8.33333333333333333333E-3;
            polv = polv*z+8.33333333333333333333E-2;
            y = z*polv;
        }
        else
        {
            y = 0.0;
        }
        y = ae_log(s, _state)-0.5/s-y-w;
    }
    if( negative!=0 )
    {
        y = y-nz;
    }
    result = y;
    return result;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movsd %xmm0, -0x10(%rbp)
movq %rdi, -0x18(%rbp)
movq $0x0, -0x70(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x30(%rbp)
movsd -0x10(%rbp), %xmm0
xorps %xmm1, %xmm1
callq 0x3c480
testb $0x1, %al
jne 0x192aa
jmp 0x193bd
movq $0x1, -0x70(%rbp)
movsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x28(%rbp)
movsd -0x28(%rbp), %xmm0
movq -0x18(%rbp), %rdi
callq 0x3c940
cvtsi2sd %rax, %xmm0
movsd %xmm0, -0x20(%rbp)
movsd -0x20(%rbp), %xmm0
movsd -0x28(%rbp), %xmm1
callq 0x3c3d0
testb $0x1, %al
jne 0x192e9
jmp 0x19317
movq -0x18(%rbp), %rdx
xorl %edi, %edi
leaq 0x3e4ef(%rip), %rsi     # 0x577e5
callq 0x3b240
movsd 0x3c4a5(%rip), %xmm0    # 0x557a8
movsd %xmm0, -0x78(%rbp)
movsd -0x78(%rbp), %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x19651
movsd -0x28(%rbp), %xmm0
subsd -0x20(%rbp), %xmm0
movsd %xmm0, -0x30(%rbp)
movsd -0x30(%rbp), %xmm0
movsd 0x3c11d(%rip), %xmm1    # 0x55450
callq 0x3c410
testb $0x1, %al
jne 0x1933e
jmp 0x193a3
movsd -0x30(%rbp), %xmm0
movsd 0x3c105(%rip), %xmm1    # 0x55450
callq 0x3c4c0
testb $0x1, %al
jne 0x19356
jmp 0x19377
movsd 0x3bcaa(%rip), %xmm0    # 0x55008
addsd -0x20(%rbp), %xmm0
movsd %xmm0, -0x20(%rbp)
movsd -0x28(%rbp), %xmm0
subsd -0x20(%rbp), %xmm0
movsd %xmm0, -0x30(%rbp)
movsd 0x3c0d9(%rip), %xmm0    # 0x55458
mulsd -0x30(%rbp), %xmm0
movq -0x18(%rbp), %rdi
callq 0x3cbf0
movaps %xmm0, %xmm1
movsd 0x3c0c0(%rip), %xmm0    # 0x55458
divsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
jmp 0x193ab
xorps %xmm0, %xmm0
movsd %xmm0, -0x30(%rbp)
movsd 0x3bc55(%rip), %xmm0    # 0x55008
subsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x10(%rbp)
movsd -0x10(%rbp), %xmm0
movsd 0x3c15e(%rip), %xmm1    # 0x55528
callq 0x3c480
testb $0x1, %al
jne 0x193d8
jmp 0x1948a
movsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x80(%rbp)
movsd -0x10(%rbp), %xmm0
movq -0x18(%rbp), %rdi
callq 0x3c940
movsd -0x80(%rbp), %xmm0
cvtsi2sd %rax, %xmm1
callq 0x3c3d0
testb $0x1, %al
jne 0x19408
jmp 0x1948a
xorps %xmm0, %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x10(%rbp), %xmm0
movq -0x18(%rbp), %rdi
callq 0x3c940
movq %rax, -0x68(%rbp)
movq $0x1, -0x60(%rbp)
movq -0x60(%rbp), %rax
movq -0x68(%rbp), %rcx
subq $0x1, %rcx
cmpq %rcx, %rax
jg 0x1946f
cvtsi2sdq -0x60(%rbp), %xmm0
movsd %xmm0, -0x40(%rbp)
movsd -0x48(%rbp), %xmm0
movsd 0x3bbb5(%rip), %xmm1    # 0x55008
divsd -0x40(%rbp), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, -0x48(%rbp)
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x1942a
movsd -0x48(%rbp), %xmm0
movsd 0x3bfc4(%rip), %xmm1    # 0x55440
subsd %xmm1, %xmm0
movsd %xmm0, -0x48(%rbp)
jmp 0x19627
movsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x38(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x40(%rbp)
movsd -0x38(%rbp), %xmm0
movsd 0x3c07f(%rip), %xmm1    # 0x55528
callq 0x3c440
testb $0x1, %al
jne 0x194b4
jmp 0x194e3
movsd -0x40(%rbp), %xmm0
movsd 0x3bb47(%rip), %xmm1    # 0x55008
divsd -0x38(%rbp), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, -0x40(%rbp)
movsd 0x3bb31(%rip), %xmm0    # 0x55008
addsd -0x38(%rbp), %xmm0
movsd %xmm0, -0x38(%rbp)
jmp 0x1949c
movsd -0x38(%rbp), %xmm0
movsd 0x3d840(%rip), %xmm1    # 0x56d30
callq 0x3c440
testb $0x1, %al
jne 0x194fe
jmp 0x195f1
movsd -0x38(%rbp), %xmm1
mulsd -0x38(%rbp), %xmm1
movsd 0x3baf8(%rip), %xmm0    # 0x55008
divsd %xmm1, %xmm0
movsd %xmm0, -0x50(%rbp)
movsd 0x3bf8f(%rip), %xmm0    # 0x554b0
movsd %xmm0, -0x58(%rbp)
movsd -0x58(%rbp), %xmm0
movsd -0x50(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd 0x3d81c(%rip), %xmm1    # 0x56d58
addsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x58(%rbp), %xmm0
movsd -0x50(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd 0x3d7f5(%rip), %xmm1    # 0x56d50
addsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x58(%rbp), %xmm0
movsd -0x50(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd 0x3d7ce(%rip), %xmm1    # 0x56d48
addsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x58(%rbp), %xmm0
movsd -0x50(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd 0x3d7a7(%rip), %xmm1    # 0x56d40
addsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x58(%rbp), %xmm0
movsd -0x50(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd 0x3d780(%rip), %xmm1    # 0x56d38
addsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x58(%rbp), %xmm0
movsd -0x50(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd 0x3bed9(%rip), %xmm1    # 0x554b0
addsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x50(%rbp), %xmm0
mulsd -0x58(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
jmp 0x195f9
xorps %xmm0, %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x38(%rbp), %xmm0
movq -0x18(%rbp), %rdi
callq 0x3cd70
movsd 0x3be41(%rip), %xmm1    # 0x55450
divsd -0x38(%rbp), %xmm1
subsd %xmm1, %xmm0
subsd -0x48(%rbp), %xmm0
subsd -0x40(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
cmpq $0x0, -0x70(%rbp)
je 0x1963d
movsd -0x48(%rbp), %xmm0
subsd -0x30(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x48(%rbp), %xmm0
movsd %xmm0, -0x78(%rbp)
movsd -0x78(%rbp), %xmm0
movsd %xmm0, -0x8(%rbp)
movsd -0x8(%rbp), %xmm0
addq $0x80, %rsp
popq %rbp
retq
nop