Merge pull request #2 from dm1sh/recursive_polynomial_simplification

Switched to "recursive" polynomial simplification
This commit is contained in:
Dmitriy Shishkov 2021-10-31 18:35:15 +05:00 committed by GitHub
commit c8682c7563
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 58 deletions

View File

@ -7,5 +7,19 @@ except:
print(n)
def f(x: int) -> int:
"""
f(x) = sum with i from 0 to n-1 (i+1)*x^i
E.g. f(x) = 5x^4 + 4x^3 + 3x^2 + 2x + 1
"""
res: int = 0
for i in range(n):
res += (i+1) * pow(x, i)
return res
for i in range(n):
print(i, -i if i % 2 == 0 else i)
print(i, f(i))

68
main.c
View File

@ -38,66 +38,26 @@ double *div_diff_es(double *x, double *y, unsigned int n)
Coeficients of simplified polynomial computation
*/
void simplify_polynomial(double *res, double *rev_el_coef, double *x, unsigned int n)
void simplify_polynomial(double *res, double *el_coef, double *x, unsigned int n)
{
double *tmp_polynomial = (double *)malloc(sizeof(double) * n);
tmp_polynomial[0] = 1;
for (int i = 0; i < n; i++)
if (rev_el_coef[i])
if (el_coef[i])
{
if (i > 0)
mult_by_root(tmp_polynomial, x[i - 1], i - 1);
for (int j = 0; j <= i; j++)
res[i - j] += (j % 2 ? -1 : 1) * rev_el_coef[i] * compute_sum_of_multiplications_of_k(x, j, i);
res[j] += el_coef[i] * tmp_polynomial[j];
}
}
double compute_sum_of_multiplications_of_k(double *arr, unsigned int k, unsigned int n)
void mult_by_root(double *res, double root, unsigned int step)
{
if (k == 0)
return 1;
if (k == 1 && n == 1)
return arr[0];
unsigned int *selected = (unsigned int *)malloc(sizeof(unsigned int) * k); // Indexes of selected for multiplication elements
int i = 0, // index of `arr` array
j = 0; // index of `selected` array
double sum = 0;
while (j >= 0)
{
if (i <= (n + (j - k)))
{
selected[j] = i;
if (j == k - 1)
{
sum += mult_by_indexes(arr, selected, k);
i++;
}
else
{
i = selected[j] + 1;
j++;
}
}
else
{
j--;
if (j >= 0)
i = selected[j] + 1;
}
}
free(selected);
return sum;
}
double mult_by_indexes(double *arr, unsigned int *indexes, unsigned int size)
{
double res = 1;
for (int i = 0; i < size; i++)
res *= arr[indexes[i]];
return res;
for (int j = step + 1; j >= 0; j--)
res[j] = (j ? res[j - 1] : 0) - (root * res[j]);
}
/*

View File

@ -30,8 +30,7 @@ void print_poly(double *coef, unsigned int n);
Coeficients of simplified polynomial computation
*/
void simplify_polynomial(double *res, double *rev_el_coef, double *x, unsigned int n);
double compute_sum_of_multiplications_of_k(double *x, unsigned int k, unsigned int n);
double mult_by_indexes(double *arr, unsigned int *indexes, unsigned int size);
void simplify_polynomial(double *res, double *el_coef, double *x, unsigned int n);
void mult_by_root(double *res, double root, unsigned int step);
#endif

View File