| 管理员 on Mon, 08 Dec 2025 04:31:28 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Partial implementation of Bessel phase function |
GEN besselphase(GEN n, GEN z, long prec) {
pari_sp av = get_avma(), av2;
GEN om, lim, est, phi, J, Y;
long l = precision(z), s;
if (l) prec = l;
n = gtofp(n, prec);
if (typ(n) != t_REAL) pari_err_IMPL("besselphase for complex order");
z = gtofp(z, prec);
if (typ(z) != t_REAL || signe(z) < 0) pari_err_IMPL("besselphase for nonpositive argument");
om = Pi2n(1, prec);
s = signe(n);
if (s < 0) n = mpabs(n);
if (!s || !signe(z) || expo(n) < -1) {
est = subrr(z, shiftr(om, -2));
} else {
int cond;
lim = n;
est = gen_0;
cond = cmprr(z, lim) > 0;
av2 = get_avma();
while (cond) {
GEN dz, dphi, dphim1, lim2;
J = real_i(jbessel(n, lim, prec));
Y = real_i(ybessel(n, lim, prec));
phi = garg(mkcomplex(J, Y), prec);
phi = addrr(phi, mulri(om, roundr(divrr(gsub(est, phi), om))));
dphi = divsr(4, mulrr(mulrr(om, z), addrr(sqrr(J), sqrr(Y))));
dphim1 = subsr(1, dphi);
dz = subrr(z, lim);
cond = 0;
if (signe(dphim1) > 0) {
lim2 = shiftr(divrr(om, dphim1), -1);
cond = cmprr(dz, lim2) > 0;
if (cond) dz = lim2;
dz = mulrr(dz, dphi);
lim = addrr(lim, lim2);
}
est = addrr(phi, dz);
if (gc_needed(av, 2)) {
if (DEBUGMEM>1) pari_warn(warnmem, "besselphase");
gerepileall(av2, 2, &est, &lim);
}
}
}
if (signe(z)) {
J = real_i(jbessel(n, z, prec));
Y = real_i(ybessel(n, z, prec));
phi = garg(mkcomplex(J, Y), prec);
phi = addrr(phi, mulri(om, roundr(divrr(gsub(est, phi), om))));
} else {
phi = est;
}
if (s < 0) {
shiftr_inplace(om, -1);
phi = addrr(phi, mulrr(om, n));
}
return gerepilecopy(av, phi);
}