4 Commits

Author SHA1 Message Date
7efb7133f6 Changed test generation function 2021-10-31 16:28:43 +03:00
5311f70746 Switched to "recursive" polynomial siplification 2021-10-31 16:26:27 +03:00
8555f1e30e Added python script for test input generation and shell script for running 2021-10-31 15:04:02 +03:00
614dfdd03d Merge pull request #1 from dm1sh/newton
Switch from Lagrange to newton interpolation polynomial
2021-10-31 03:51:17 +03:00
5 changed files with 49 additions and 59 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@ a.out
main main
.vscode .vscode
vgcore* vgcore*
output.txt

25
input.py Normal file
View File

@ -0,0 +1,25 @@
import sys
try:
n = int(sys.argv[1])
except:
n = 5
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, f(i))

69
main.c
View File

@ -38,66 +38,26 @@ double *div_diff_es(double *x, double *y, unsigned int n)
Coeficients of simplified polynomial computation 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++) 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++) 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)
{
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); void mult_by_root(double *res, double root, unsigned int step)
return sum;
}
double mult_by_indexes(double *arr, unsigned int *indexes, unsigned int size)
{ {
double res = 1; for (int j = step + 1; j >= 0; j--)
for (int i = 0; i < size; i++) res[j] = (j ? res[j - 1] : 0) - (root * res[j]);
res *= arr[indexes[i]];
return res;
} }
/* /*
@ -199,7 +159,8 @@ void print_poly(double *coef, unsigned int n)
printf("*x"); printf("*x");
if (i > 1) if (i > 1)
printf("^%d ", i); printf("^%d ", i);
else printf(" "); else
printf(" ");
} }
} }

View File

@ -30,8 +30,7 @@ void print_poly(double *coef, unsigned int n);
Coeficients of simplified polynomial computation 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 compute_sum_of_multiplications_of_k(double *x, unsigned int k, unsigned int n); void mult_by_root(double *res, double root, unsigned int step);
double mult_by_indexes(double *arr, unsigned int *indexes, unsigned int size);
#endif #endif

4
test.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh
gcc main.c
python input.py $1 | tee /dev/fd/2 | ./a.out | tee output.txt