Расчет полинома
От: eddy_cs Россия  
Дата: 28.04.10 13:34
Оценка:
Добрый день,

Задача состоит в следующем:
Имеются входные данные, выражения в форме (P)/D,
где P – полином с целыми коэффициентами и сумма выражений Cn^E;
D – положительный целый знаменатель.
Например список выражений:
(n^2-n)/2
(-n^14-11n+1)/3
....
и т.д.

Необходимо определить будет ли для любого положительного n результат выражения всегда целым числом.
т.е. при всех ли целых положительных n результат выражения будет целым числом или есть значения n
при которых выражение выдаёт дробный результат ?
Re: Расчет полинома
От: dilmah США  
Дата: 28.04.10 13:40
Оценка: 1 (1) +1
_>Необходимо определить будет ли для любого положительного n результат выражения всегда целым числом.
_>т.е. при всех ли целых положительных n результат выражения будет целым числом или есть значения n
_>при которых выражение выдаёт дробный результат ?

подставить все числа от 0 до D-1
Re: Расчет полинома
От: cvetkov  
Дата: 28.04.10 15:34
Оценка: -2
представить полином в виде (n-t1)*(n-t2)...
где t1, t2 ... положительные коэфициенты.
убедиться что среди них есть непрерывная последовательность длинны D
... << RSDN@Home 1.2.0 alpha 4 rev. 1227>>
Re[2]: Расчет полинома
От: unreg_flex  
Дата: 28.04.10 16:18
Оценка: +1
Здравствуйте, cvetkov, Вы писали:

C>представить полином в виде (n-t1)*(n-t2)...

C>где t1, t2 ... положительные коэфициенты.

Возьмем n^2+1
представляйте ...
Re: Расчет полинома
От: Буравчик Россия  
Дата: 28.04.10 16:57
Оценка: 8 (2) +2
Здравствуйте, eddy_cs, Вы писали:

_>(n^2-n)/2

_>(-n^14-11n+1)/3

_>Необходимо определить будет ли для любого положительного n результат выражения всегда целым числом.

_>т.е. при всех ли целых положительных n результат выражения будет целым числом или есть значения n
_>при которых выражение выдаёт дробный результат ?

По условию задачи P(n) делится на D, а также P(n+1) делится на D.

Отсюда следует, что P() делится на D, тогда и только тогда, когда:
1. P(0) делится на D, т.е. свободный член многочлена делится на D.
2. Многочлен P'() = P(n+1)-P(n) тоже делится на D.

Получили исходную задачу (п.2), но с многочленом P', который имеет степень на единицу меньше, чем исходный многочлен.
Выполнив несколько шагов мы уменьшим степень многочлена до нуля и сможем получить ответ. Вычисление многочлена P(n+1) — это вычисление биномиальных коэффициентов.

Пример (из задачи выше):
P = n^2-n
P' = P(n+1)-P(n) = (n^2+2n+1-n-1) — (n^2-n) = 2n
P'' = P'(n+1)-P'(n) = (2n+2)-2n = 2, т.е. делится на 2

Пример (из задачи выше):
P = -n^14-11n+1
свободный член = 1, не делится на D, значит найдутся n, при которых P(n) не делится на 3

Сложность такого алгоритма O(K^2), где K — степень многочлена.

Если D < K, то быстрее будет, как предложено в сообщении выше, рассчитать все значения P(n) по модулю D, где n = 0..D-1. Сложность O(K*D), где K — степень многочлена.
Best regards, Буравчик
Re: Расчет полинома
От: MBo  
Дата: 28.04.10 17:07
Оценка:
Здравствуйте, eddy_cs, Вы писали:


_>Необходимо определить будет ли для любого положительного n результат выражения всегда целым числом.

_>т.е. при всех ли целых положительных n результат выражения будет целым числом или есть значения n
_>при которых выражение выдаёт дробный результат ?

http://books.google.com/books?id=9GuDT2Wyp6oC&amp;pg=PA120&amp;lpg=PA120&amp;dq=polynomial+representing+integer&amp;source=bl&amp;ots=3jYfBeVPhc&amp;sig=cJJX8ZefVXJK-8tYlxRRipEc32w&amp;hl=en&amp;ei=wGjYS6iADpD9Of39mP8G&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4&amp;ved=0CBUQ6AEwAw#v=onepage&amp;q=polynomial%20representing%20integer&amp;f=false

Насколько я понимаю, нужно получить коэффициенты Ai приведенной там формулы, и убедиться, что они целые.
Для больших степеней, пожалуй, накладно будет...
Re[3]: Расчет полинома
От: cvetkov  
Дата: 28.04.10 17:09
Оценка: -1
Здравствуйте, unreg_flex, Вы писали:

_>Возьмем n^2+1

согласен. лох.
... << RSDN@Home 1.2.0 alpha 4 rev. 1227>>
Re[2]: Расчет полинома
От: Аноним  
Дата: 28.04.10 19:27
Оценка:
Б>Если D < K, то быстрее будет, как предложено в сообщении выше, рассчитать все значения P(n) по модулю D, где n = 0..D-1. Сложность O(K*D), где K — степень многочлена.

Рассматриваем задачу P(n) = 0(mod D), P(n) степени К
если D — простое то D <= K.
И многочлен должен быть вида Y(n) * n(n-1)*..(n-d+1). потому что в поле нет делителей нуля.
Если D — составное, то тогда может быть и меньшей степени.
Re[3]: Расчет полинома
От: Аноним  
Дата: 28.04.10 19:33
Оценка:
Здравствуйте, unreg_flex, Вы писали:

_>Здравствуйте, cvetkov, Вы писали:


C>>представить полином в виде (n-t1)*(n-t2)...

C>>где t1, t2 ... положительные коэфициенты.

_>Возьмем n^2+1

_>представляйте ...

Надо добавить в кольце вычетов D.
тогда если D = 2 то
n^2+1 = (n+1)*(n+1)
Re[2]: Расчет полинома
От: batu Украина  
Дата: 29.04.10 04:42
Оценка:
Здравствуйте, MBo, Вы писали:

MBo>Здравствуйте, eddy_cs, Вы писали:



_>>Необходимо определить будет ли для любого положительного n результат выражения всегда целым числом.

_>>т.е. при всех ли целых положительных n результат выражения будет целым числом или есть значения n
_>>при которых выражение выдаёт дробный результат ?

MBo>http://books.google.com/books?id=9GuDT2Wyp6oC&amp;pg=PA120&amp;lpg=PA120&amp;dq=polynomial+representing+integer&amp;source=bl&amp;ots=3jYfBeVPhc&amp;sig=cJJX8ZefVXJK-8tYlxRRipEc32w&amp;hl=en&amp;ei=wGjYS6iADpD9Of39mP8G&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4&amp;ved=0CBUQ6AEwAw#v=onepage&amp;q=polynomial%20representing%20integer&amp;f=false


MBo>Насколько я понимаю, нужно получить коэффициенты Ai приведенной там формулы, и убедиться, что они целые.

MBo>Для больших степеней, пожалуй, накладно будет...
Все коэффициенты должны делиться на нацело на D. Тогда для любого n...Очевидно
Re[2]: Расчет полинома
От: eddy_cs Россия  
Дата: 29.04.10 13:48
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>По условию задачи P(n) делится на D, а также P(n+1) делится на D.


Б>Отсюда следует, что P() делится на D, тогда и только тогда, когда:

Б>1. P(0) делится на D, т.е. свободный член многочлена делится на D.
Б>2. Многочлен P'() = P(n+1)-P(n) тоже делится на D.

Б>Получили исходную задачу (п.2), но с многочленом P', который имеет степень на единицу меньше, чем исходный многочлен.

Б>Выполнив несколько шагов мы уменьшим степень многочлена до нуля и сможем получить ответ. Вычисление многочлена P(n+1) — это вычисление биномиальных коэффициентов.

Б>Пример (из задачи выше):

Б>P = n^2-n
Б>P' = P(n+1)-P(n) = (n^2+2n+1-n-1) — (n^2-n) = 2n
Б>P'' = P'(n+1)-P'(n) = (2n+2)-2n = 2, т.е. делится на 2

Б>Пример (из задачи выше):

Б>P = -n^14-11n+1
Б>свободный член = 1, не делится на D, значит найдутся n, при которых P(n) не делится на 3

Б>Сложность такого алгоритма O(K^2), где K — степень многочлена.


Б>Если D < K, то быстрее будет, как предложено в сообщении выше, рассчитать все значения P(n) по модулю D, где n = 0..D-1. Сложность O(K*D), где K — степень многочлена.


Спасибо Вам за подробный ответ.
Но как поступить если степень велика ? Степень максимально может иметь значение — 100
Re[3]: Расчет полинома
От: Буравчик Россия  
Дата: 29.04.10 17:06
Оценка:
Здравствуйте, eddy_cs, Вы писали:

_>Но как поступить если степень велика ? Степень максимально может иметь значение — 100


А ограничения на D какие?
Best regards, Буравчик
Re[3]: Расчет полинома
От: Аноним  
Дата: 29.04.10 17:53
Оценка:
_>Но как поступить если степень велика ? Степень максимально может иметь значение — 100

Велика для чего? по сравнению с чем?
Вы же на компьютере хотите посчитать, я надеюсь?
Re[4]: Расчет полинома
От: eddy_cs Россия  
Дата: 30.04.10 05:53
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>А ограничения на D какие?


D может изменятся от 1 до 2^31
Совершенно согласен с Вами, что когда D мало, подставить значения n (в диапазоне от 0 до D-1) во входное выражение, будет приемлемым решением.
Но когда D будет ближе к 2^31, необходимо немного другое решение.

В программе предполагается оценить выражение, если D имеет небольшое значение
идем по 1-му варианту решения (как Вы предложили подставить в полином n в диапазоне от 0 до D-1),
иначе (если D большое) идем по 2-варианту решения (???)
Пороговое значение, с которым проверяется D, хранится в конфигурации программы.
Re[4]: Расчет полинома
От: eddy_cs Россия  
Дата: 30.04.10 08:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Велика для чего? по сравнению с чем?

А>Вы же на компьютере хотите посчитать, я надеюсь?

ответ на Ваш вопрос
Автор: eddy_cs
Дата: 30.04.10
Re[5]: Расчет полинома
От: Аноним  
Дата: 30.04.10 10:00
Оценка: 1 (1)
_>D может изменятся от 1 до 2^31
>>Степень максимально может иметь значение — 100

Если D простое,то степень К не может быть меньше D для удовлетворения условиям.
Если D составное, то степень не может быть меньше phi(D) (функция эйлера — количество взаимно простых с D и <D).
(Это гипотеза но интуитивно где-то здесь), так как взаимно простые с D не являются делителями нуля.

Поэтому ограничения на D здесь не особо важны. для больших D автоматом будет fail.
график phi(D) http://ru.wikipedia.org/wiki/Файл:EulerPhi.svg

При K <= 100 верхняя граница по D будет {phi(D) <= 100}. ну явно MaxD << 1000.

Всё решается грубой проверкой порядков K и phi(D).
1) false при слишком больших D
2) подстановкой чисел от (0 до D-1) по модулю D.
Re[6]: Расчет полинома
От: Аноним  
Дата: 30.04.10 18:24
Оценка:
Вот ещё алгоритм:

1) сокращаем НОД(коэфф) и приводим коэфф по модулю D

2) Если D — простое то заменяем n^D на n пока возможно,
получился 0 => true
иначе => false

/n^D — n = 0 (mod D) для любого n по т. Эйлера. и по т.Безу разложение по корням над полем будет n(n-1)(n-2).. и
многочлены одной степени над полем совпадают, если все корни совпадают/

3) Если D = степень простого, — то
одна надежда, что K действительно должно быть >= phi(D) (как доказать не знаю). и проверять подстановкой.

4) Если D = разложению в простые, то для каждого элемента из разложения пункт 2 или 3 должен быть истинным.
Re[2]: Расчет полинома
От: Аноним  
Дата: 02.05.10 21:57
Оценка:
Здравствуйте, Буравчик, Вы писали:
Б>Отсюда следует, что P() делится на D, тогда и только тогда, когда:
Б>1. P(0) делится на D, т.е. свободный член многочлена делится на D.
Б>2. Многочлен P'() = P(n+1)-P(n) тоже делится на D.

Действуем по данной схеме (только вместо делимости сравниваем с 0 по модулю D)
1. f(0) -> 0
2. f1(0) = [f(n+1)-f(n)] (0) = f(1) -> 0
3. f2(0) = [f1(n+1)-f1(n)] (0) = f1(1) = f(2) -> 0
4. f3(0) = [f2(n+1) — f2(n)](0) = f2(1) = f1(2) = f(3) -> 0

и т.д.
Вобщем вы не знаете случайно зачем тут коэффициенты многочленов считать?
Согласно приведённой схеме мы знаем, что надо сделать не более К + 1 проверок, после этого у нас должен получится многочлен 0 степени.
ну значит и проверяем F от 0 до K ?

зы. что-то красиво слишком, не?
Re[6]: Расчет полинома
От: eddy_cs Россия  
Дата: 05.05.10 06:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если D простое,то степень К не может быть меньше D для удовлетворения условиям.

А>Если D составное, то степень не может быть меньше phi(D) (функция эйлера — количество взаимно простых с D и <D).
А>(Это гипотеза но интуитивно где-то здесь), так как взаимно простые с D не являются делителями нуля.

А>Поэтому ограничения на D здесь не особо важны. для больших D автоматом будет fail.

А>график phi(D) http://ru.wikipedia.org/wiki/Файл:EulerPhi.svg

А>При K <= 100 верхняя граница по D будет {phi(D) <= 100}. ну явно MaxD << 1000.


А>Всё решается грубой проверкой порядков K и phi(D).

А>1) false при слишком больших D
А>2) .

Не понятно как можно реализовать phi(D) в программе.
Т.е. считаем если D > 1000, значит будут значения n при которых полином выдаёт дробный результат
Если D < 1000, значит подставляем n от (0 до D-1) в полином и анализируем получился ли на этом диапазоне дробный результат
??
Re[7]: Расчет полинома
От: Аноним  
Дата: 05.05.10 17:28
Оценка:
_>Не понятно как можно реализовать phi(D) в программе.
_>Т.е. считаем если D > 1000, значит будут значения n при которых полином выдаёт дробный результат
_>Если D < 1000, значит подставляем n от (0 до D-1) в полином и анализируем получился ли на этом диапазоне дробный результат
_>??

это я не в ту степь.
про phi это просто гипотеза была о том как примерно устроены такие многочлены. не обращайте внимания.

Помоему для вашей задачи чисто практически достаточно уже приведённого решения =
проверить F в точках [0.. min(K, D-1)] по модулю D.

Если хочется поразнообразней, то можно факторизовать D чтоб получить разложение в простые, но это уже само по себе может быть достаточно громоздким.
И тогда тут уже можно воспользоваться простой проверкой коэффициентов многочлена для каждого простого числа из разложения.
При этом для степеней простых в разложении мне так и непонятна хорошая формула. так что для них всё равно вычислять F в диапазоне придётся.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.