ihq.plВот код:
Код:
Sn_vector(a, b, r, x0, y0, n) = {
my( a2 = a^2 / r^2,
b2 = b^2 / r^2,
x2 = 4 * x0^2 / r^2,
y2 = 4 * y0^2 / r^2,
maxFact = 4*n,
F = vector(maxFact + 1, i, (i-1)!),
coeff = 4 * a * b / r^2,
Omega_cache = matrix(n+1, n+1),
current_S,
S = vector(n+1, i, 0),
delta );
Omega_cache[1, 1] = 1;
current_S = coeff;
S[1] = current_S;
for(n = 1, n,
delta = 0;
for(m = 0, n,
my( n_idx = n - m );
\\ Вычисляем Omega сразу, без проверки
Omega_cache[m+1, n_idx+1] = sum(j = 0, m,
(-1)^j * x2^j *
sum(i = 0, n_idx,
(-1)^i * y2^i *
F[m+j+n_idx+i+1] / (F[m-j+1] * F[n_idx-i+1] * F[2*j+1] * F[2*i+1])
)
);
delta += (-1)^n / ((2*m + 1) * (2*n_idx + 1)) *
a2^m * b2^n_idx * Omega_cache[m+1, n_idx+1]
);
current_S += coeff * delta;
S[n+1] = current_S
);
return(S);
}
Вставляете его в синий бокс тут:
https://pari.math.u-bordeaux.fr/gp.htmlНажимаете "evaluate with pari", и затем нажимаете "clear input"
Теперь копируете строчку
v=Sn_vector(1,1,2,1/2,1/3,50); print("Ready");в тот же синий бокс и нажимаете "evaluate with pari"
Ждёте
В красном боксе появится Ready
Теперь в синем боксе печатаете
v[45]+.Нажимаете "evaluate with pari"
В красном боксе появлется Sn для n=45
Ну и т.п.
Аргументы:
Sn_vector(a, b, r, x0, y0, n)Функция возвращает вектор из n рациональных чисел (точных!) соответствующих частичным суммам вашего ряда.
Еслииаргументы рациональные, и если напечатать в синий бокс v[5] (то есть без +.) то получите
точное значение в виде p/q
? v[5]
%6 = 596763551383/677221171200Факториалы и

кешируются чтобы много раз не вычислять, ну и за один проход вычисляются все частичные суммы, по скорости практически то же самое что вычислить последнюю.