Skip to content

Commit

Permalink
Implement bigpol module
Browse files Browse the repository at this point in the history
Fix some bugs and mistakes in bignat and bigrat
Add help gfor bigpol module
  • Loading branch information
stnrepin authored and dmtnikolaev committed Mar 30, 2019
1 parent c27b150 commit 025dd60
Show file tree
Hide file tree
Showing 11 changed files with 778 additions and 27 deletions.
4 changes: 2 additions & 2 deletions include/bigpolynom.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ void BigPol_mul_scalar(const BigPol *f, const BigRat *c, BigPol *h);
* @param k Степень одночлена.
* @param h Результат.
*/
void BigPol_mul_expx(const BigPol *f, const BigNat *k, BigPol *h);
void BigPol_mul_expx(const BigPol *f, const size_t k, BigPol *h);

/**
* Возвращает старший коэффициент многочлена.
Expand All @@ -124,7 +124,7 @@ void BigPol_get_leading(const BigPol *f, BigRat *a_n);
* @param f Многочлен.
* @param deg Степень.
*/
void BigPol_get_deg(const BigPol *f, BigNat *deg);
void BigPol_get_deg(const BigPol *f, size_t *deg);

/**
* Выносит из многочлена НОК знаменателей коэффициентов и НОД числителей.
Expand Down
8 changes: 8 additions & 0 deletions include/bigrat.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,14 @@ error_t BigRat_from_string(BigRat *a, const char *str);
*/
void BigRat_to_string(const BigRat *a, char **str);

/**
* Переводит число в дробь.
*
* @param a Дробь.
* @param i Число.
*/
void BigRat_from_num(BigRat *a, size_t i);

/**
* Сокращает дробь.
*
Expand Down
6 changes: 6 additions & 0 deletions include/consts.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,16 @@

#define BIGNUMLIB_VERSION "0.9"

#define SIZE_T_MAX_DIGITS ( 241 * sizeof(size_t) / 100 + 1 )

#ifdef WINDOWS
#define PURE_C_STRING_FORMAT_SPEC L"%S"

// see https://stackoverflow.com/a/43789115
#define SIZE_T_FORMAT_SPEC "I"
#elif LINUX
#define PURE_C_STRING_FORMAT_SPEC L"%s"
#define SIZE_T_FORMAT_SPEC "z"
#else
#error "unknown platform"
#endif
Expand Down
47 changes: 46 additions & 1 deletion include/help.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,10 +169,55 @@ static const wchar_t rat_help_3[] = L"\
static const wchar_t pol_help_1[] = L"\
МНОГОЧЛЕНЫ (BigPol)\n\
\n\
В данный момент модуль не реализован.\n\
Состоят из набора коэффициентов - рациональных\n\
чисел. Причем, степень при которой находится\n\
коэффициент равна его индексу в наборе (начиная с\n\
0. Так, например, набор (1,3/4,0,-2) соответствует\n\
многочлену x^3 + 3/2x^2 - 2.\n\
\n\
* pol.help\n\
Выводит справку для модуля многочленов.\n\
\n\
* pol.sum f g\n\
Складывает два многочлена.\n\
\n\
* pol.sub f g\n\
Вычитает многочлен f из многочлена g.\n\
\n\
* pol.mul-scalar f q\n\
Умножает f на рациональное число q.\n\
\n\
* pol.mul-expx f k\n\
Умножает f на x^k, где k - натуральное.\n\
\n\
* pol.leading f\n\
Возвращает старший коэффициент.\n\
\n\
* pol.deg f\n\
Возвращает степень многочлена.\n\
\n\
* pol.fac f\n\
Выносит из многочлена НОК знаменателей\n\
коэффициентов и НОД числителей.\n\
\n\
* pol.mul f g\n\
Умножает два многочлена\n\
\n\
* pol.div f g\n\
Возвращает частное от деления f на g.\n\
\n\
* pol.mod f g\n\
Возвращает остаток от деления f на g.\n\
\n\
* pol.gcd f g\n\
Возвращает НОД многочленов.\n\
\n\
* pol.der f\n\
Находит производную f.\n\
\n\
* pol.nmr f\n\
Преобразует все кратные корни f в простые.\n\
\n\
";

#endif
12 changes: 11 additions & 1 deletion include/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,14 @@ error_t str_to_digit(const char *str, digit *d);
*/
error_t char_to_digit(const char ch, digit *d);

#endif /* !UTILS_H */
/**
* Подсчитывает количество вхождений символа в строке.
*
* @param str Строка.
* @param s Символ.
* @return size_t Количество вхождений.
*/
size_t count_occurs(const char *str, char s);

#endif /* !UTILS_H */

22 changes: 14 additions & 8 deletions src/actions.c
Original file line number Diff line number Diff line change
Expand Up @@ -597,17 +597,21 @@ error_t bigpol_mul_scalar_action(int argc, const char **argv, char **res) {
}

error_t bigpol_mul_expx_action(int argc, const char **argv, char **res) {
BigNat *k;
size_t k;
BigPol *f, *h;
error_t err;

INIT_ACTION_WITH_TWO_PARAMS(BigPol, BigNat, f, k, argv[0], argv[1], err);
if (sscanf(argv[1], "%"SIZE_T_FORMAT_SPEC"x", &k) != 1) {
return PE_PARSING;
}

INIT_ACTION_WITH_ONE_PARAM(BigPol, f, argv[0], err);
BigPol_new(&h);

BigPol_mul_expx(f, k, h);
BigPol_to_string(h, res);

FIN_ACTION_WITH_TWO_PARAMS(BigPol, BigNat, f, k);
FIN_ACTION_WITH_ONE_PARAM(BigPol, f);
BigPol_destroy(h);

return SUCCESS;
Expand All @@ -631,18 +635,20 @@ error_t bigpol_get_leading_action(int argc, const char **argv, char **res) {
}

error_t bigpol_get_deg_action(int argc, const char **argv, char **res) {
BigNat *deg;
size_t deg;
BigPol *f;
error_t err;

INIT_ACTION_WITH_ONE_PARAM(BigPol, f, argv[0], err);
BigNat_new(&deg);

BigPol_get_deg(f, deg);
BigNat_to_string(deg, res);
BigPol_get_deg(f, &deg);
*res = (char *)malloc(SIZE_T_MAX_DIGITS * sizeof(char));
if (*res == NULL) {
handle_critical_error(PE_ALLOC);
}
sprintf(*res, "%"SIZE_T_FORMAT_SPEC"x", deg);

FIN_ACTION_WITH_ONE_PARAM(BigPol, f);
BigNat_destroy(deg);

return SUCCESS;
}
Expand Down
2 changes: 2 additions & 0 deletions src/bignat.c
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,8 @@ error_t BigNat_div_mod(const BigNat *a, const BigNat *b, BigNat *c, BigNat *rem)
BigNat_new(&tmp);
BigNat_new(&shifted_b);

memset(c->digits, 0, c->available_size);

BigNat_copy(a, rem);

c->size = 0;
Expand Down
Loading

0 comments on commit 025dd60

Please sign in to comment.