Мне нужно знать, какую библиотеку, совместимую с C++, можно использовать для интерполяции многочлена. Таким образом, по заданным $n$ парам точка-значение он может восстановить полином. Библиотека должна поддерживать большие целые числа (множественной точности), так как мой полином определен в кольце полиномов R[x], где R — 1024-битное число.
Примечание. Я использовал NTL, но, по-видимому, он не поддерживает большие целые числа.
Я нашел интерполяцию NTL полезной, поэтому ниже интерполяция NTL с небольшими изменениями. Теперь он работает с большим целым числом типа GMP mpz_t. Он был протестирован много раз и отлично работает (насколько я наблюдал).
Примечание: N — модули. Приведенная ниже функция позволяет интерполировать многочлен $f$ по парам $(a,b)$ (т.е. $(a_0,b_0),...,(a_n,b_n)$ ), где $f(a_i)= б_и$. Функция возвращает коэффициенты многочлена $f$. Здесь размер равен $n$.
#include<gmp.h>
#include <gmpxx.h>
typedef mpz_t bigint;
bigint* interpolate(int size, bigint* a, bigint* b,bigint N)
{
long m = size;
bigint* prod;
prod=(mpz_t*)malloc(size*sizeof(mpz_t));
prod = a;
bigint t1, t2;
mpz_init(t1);
mpz_init(t2);
int k, i;
bigint* res;
res=(mpz_t*)malloc(size*sizeof(mpz_t));
bigint aa;
for (k = 0; k < m; k++) {
mpz_init_set(aa ,a[k]);
mpz_init_set_str(t1,"1",10);
for (i = k-1; i >= 0; i--) {
mpz_mul(t1, t1, aa);
mpz_mod(t1, t1,N);
mpz_add(t1, t1, prod[i]);
}
mpz_init_set_str(t2,"0",10);
for (i = k-1; i >= 0; i--) {
mpz_mul(t2, t2, aa);
mpz_mod(t2, t2,N);
mpz_add(t2, t2, res[i]);
}
mpz_invert(t1, t1,N);
mpz_sub(t2, b[k], t2);
mpz_mul(t1, t1, t2);
for (i = 0; i < k; i++) {
mpz_mul(t2, prod[i], t1);
mpz_mod(t2, t2,N);
mpz_add(res[i], res[i], t2);
mpz_mod(res[i], res[i],N);
}
mpz_init_set(res[k], t1);
mpz_mod(res[k], res[k],N);
if (k < m-1) {
if (k == 0)
mpz_neg(prod[0], prod[0]);
else {
mpz_neg(t1, a[k]);
mpz_add(prod[k], t1, prod[k-1]);
for (i = k-1; i >= 1; i--) {
mpz_mul(t2, prod[i], t1);
mpz_mod(t2, t2,N);
mpz_add(prod[i], t2, prod[i-1]);
}
mpz_mul(prod[0], prod[0], t1);
mpz_mod(prod[0], prod[0],N);
}
}
}
while (m > 0 && (res[m-1]==0)) m--;
return res;
}
alglib.net , кажется, предоставляет бесплатную библиотеку множественной точности С++ и, кажется, делает то, что вам нужно, хотя вам нужно платить за поддержку многопоточности.
пользователь13676
MSEoris
пользователь13676