Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2010, 16:21   #1
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию Длинное деление в столбик

Да по школьному, но для больших чисел. Собственно все получается, но основная проблема в том, что это медленно. Основная проблема в подборе числа на которое делится фрагмент делимого.
Например нужно нам 125 по-делить 6.
Так вот я беру 12 и вычитаю с него 6 пока это возможно. Ладно мелочь вроде, но если взять число 123456789 и поделить его на 6213, то вычитание будет гораздо медленней. Аналогично, чем больше разрядов, тем медленней процесс, потому что вычитание тоже самописное. А это уже потому, что есть вероятность деления на число не умещающееся в стандартный числовой тип Дельфи (собственно для этого и стараюсь). Есть варианты по ускорению процесса?

Зы. Про Окулова знаю.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 29.11.2010, 16:25   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ну, я например сначала реализовал длинное вычитание, а затем с помощью него делал деление. Скорость была вполне неплохая.
_-Re@l-_ вне форума Ответить с цитированием
Старый 29.11.2010, 16:28   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Ну, я например сначала реализовал длинное вычитание, а затем с помощью него делал деление. Скорость была вполне неплохая.
И у меня так. Я хочу быстрей . Неплохая скорость для чисел с числом разрядов менее 100. Возможно существует способ как-то не полностью вычитать...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 29.11.2010, 16:45   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Тут еще вопрос в том, в каком виде числа хранятся. Если это строка с десятиричным числом (1 символ = 1 разряду), то быстрее вряд ли получится. Если же попробовать замутить какую-нибудь 10000-ричную систему счисления, то ,возможно, на том же алгоритме удастся получить лучшие результаты за счет уменьшения числа операций.
Это всё правда теоретически. У самого руки до длинной арифметики так и не дошли
pu4koff вне форума Ответить с цитированием
Старый 29.11.2010, 16:50   #5
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

2ой том Кнута. Он использует алгоритм получения обратной величины для деления и доказывает, что асимптотически сложность алгоритма деления в этом случае не превышает сложности алгоритма умножения. Все будет зависеть от вашей реализации умножения. Можете про это тоже у него прочитать или еще где-нибудь.
still_alive вне форума Ответить с цитированием
Старый 29.11.2010, 16:52   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Да числа хранятся так 1 байт - 1 разряд. Насчет 10000 - это тоже не выход - просто оптимально для определенного диапазона.
Цитата:
2ой том Кнута. Он использует алгоритм получения обратной величины для деления и доказывает, что асимптотически сложность алгоритма деления в этом случае не превышает сложности алгоритма умножения. Все будет зависеть от вашей реализации умножения. Можете про это тоже у него прочитать или еще где-нибудь.
Проблема книг Кнута в том, что они написаны Кнутом для Кнута, а не для людей. Чувствуете разницу?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 29.11.2010, 16:59   #7
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Проблема книг Кнута в том, что они написаны Кнутом для Кнута, а не для людей. Чувствуете разницу?
Нет. Я чувствую разницу только между тем, кто понимает математику, и между тем, кто ее не понимает. Как я понимаю, вы тоже эту разницу чувствуете)
still_alive вне форума Ответить с цитированием
Старый 29.11.2010, 17:06   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Есть варианты по ускорению процесса?

Зы. Про Окулова знаю.
Окулова не читал, не знаю, не приходилось.
Мысль такая (ваш пример "если взять число 123456789 и поделить его на 6213").
Делимое - М разрядов, делитель - N разрядов.
Выделяем M-N+1 старших разрядов делителя и делим на цифру старшего разряда делителя (или вычитаем, если вам так дорого именно вычитание). Получаем первое частное. Вернее, почти точную целую часть частного.
Попадаем сразу в +-1. То есть, если N младших разрядов делимого (вернее, число, соответствующее им) больше делителя, то +1 к полученному частному, если меньше - то -1. Или +0.
Ну, а насчет "ковыряния" с остатком не думал. Лень
Вот как-то примерно вот так...
А может, я и не прав...

Последний раз редактировалось mihali4; 29.11.2010 в 17:11.
mihali4 вне форума Ответить с цитированием
Старый 29.11.2010, 17:28   #9
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Кстати да, на алголисте был описан алгоритм деления с помощью угадывания частного с последующей его корректировкой. Сложность вроде ~O(произведение длин чисел). Не самый быстрый, конечно, но всяко быстрее тупого вычитания.
still_alive вне форума Ответить с цитированием
Старый 30.11.2010, 06:45   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Нет. Я чувствую разницу только между тем, кто понимает математику, и между тем, кто ее не понимает. Как я понимаю, вы тоже эту разницу чувствуете)
Наверно, также следует знать разницу между тем кто не понимает математику и тем, кто делает вид что понимает .

Цитата:
Делимое - М разрядов, делитель - N разрядов.
Выделяем M-N+1 старших разрядов делителя и делим на цифру старшего разряда делителя (или вычитаем, если вам так дорого именно вычитание). Получаем первое частное. Вернее, почти точную целую часть частного.
Попадаем сразу в +-1. То есть, если N младших разрядов делимого (вернее, число, соответствующее им) больше делителя, то +1 к полученному частному, если меньше - то -1. Или +0.
Мысль интересная, попробую реализовать на практике. Только мне кажется в не в +-1, а именно в -1 либо нуль.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
скрипт выводит в столбик а надо в строчку zander PHP 2 04.01.2010 21:53
умножить столбик Betty Microsoft Office Excel 10 27.07.2009 19:10