LINUX.ORG.RU

[глупый вопрос]деление больших чисел

 


0

0

Можно как-нибудь выполнить целочисленное деление с остатком очень большого числа (более 20 цифр) на простое двузначное число, не прибегая при этом к GMP и подобным библиотекам? (большое число доступно по частям)

★★★★★

да, забыл сказать, что цель всего этого действа - определить остаток, а не частное

kranky ★★★★★
() автор топика

>не прибегая при этом к GMP и подобным библиотекам?

в столбик :)

dimon555 ★★★★★
()

поищи по форуму. тут недавно кто-то спрашивал то же самое, только про умножение

Corey
()

а вообще используй питон

>>> 10 % 3
1
>>> 1234123412351451514514514531234142L % 172
42L
>>> 

dimon555 ★★★★★
()

вспомни как доказываются критерии делимости на два, три и т.д.:)

достаточно реализовать арифметику по модулю этого двухзначного числа.

Тогда число записанное в десятичном или двоичном виде -- по модулю равно просто значению многочлена. Вспомни заодно схему Горнера:)

То есть чтобы посчитать 12345 % 7 нужно вычислить (((1*10 + 2)*10 + 3)*10 + 4)*10 + 5 посчитанное в арифметике по модулю 7

dilmah ★★★★★
()
Ответ на: комментарий от kranky

>цель всего этого действа - определить остаток

Есть методы, основанные на модулярной арифметике: http://mod.stavsu.ru/index.php?action=articles например:

Н.И. Червяков, И.Н. Лавриненко, С.В. Лавриненко, О.С. Мезенцева Методы и алгоритмы округления, масштабирования и деления чисел в модулярной арифметике http://mod.stavsu.ru/articles/sokcon36.pdf

Н.И. Червяков, Лобес М.В. Целочисленное деление в системе остаточных классов http://mod.stavsu.ru/articles/infcom3_4.pdf

quickquest ★★★★★
()

реализуй длинное число.

сделай функцию чтения.

сделай функцию вычитания из длинного короткого.
[code]
longint a;
shortint b;

while (a > b) {
    a -= b;
}

return a;[/code]

Valdemard
()
Ответ на: комментарий от Valdemard

лучше собрать кластер из shortint b серверов и прогнать на нем

dilmah ★★★★★
()

Предложу и я свой велосипед :)

(a0 + a1 + ... + an) % c = (a0 % c + a1 % c + ... + an % c) % c
Если a0 = a1 = a2 = ... = an, то
[a0 * (n + 1)] % c = [(n + 1) * (a0 % c)] %c
или (a * b) % c = (b * (a % c)) % c
Длинное число k = a1a2a3a4b1b2b3b4c1c2c3c4 = a1a2a3a4 * 10^8 + b1b2b3b4 * 10^4 + c1c2c3c4
Тогда k % m = (a1a2a3a4 * 10^8) % m + (b1b2b3b4 * 10^4) % m + c1c2c3c4 % m

Алгоритм следующий.
1. Делим число на части с которыми можно производить быстрые арифметические операции.
2. Остаток = 0; П1 = 1.
3. П1 = П1 % Делитель;
П2 = П1 * Младшая часть;
Остаток = Остаток + П2 % Делитель;
4. П1 = П1 * 10^(длина части числа)
5. Удалить младшую часть числа.
6. Если есть еще части, то повторить 3, иначе закончить программу.

Kristi
()

Отлично. Благодарю всех за ваши велосипеды^W^Wвашу помощь =)

kranky ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.