Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Работа с большими числами в Pascal

Страницы: 1 2 3 4 След.
Работа с большими числами в Pascal
Кто-нибудь работал с большими целыми числами в Pascal? Нужно производить вычисления с большой скоростью. Как в этом плане - если сделать прогу на Pascal, то какова будет скорость по сравнению с C++ и PHP, например?
Accende lumen sensibus, infude ainorem corbidus!
Опишу подробнее, что мне нужно. Нужно возводить в целые степени большие числа, далее их складывать и извлекать корень произвольной степени.
Accende lumen sensibus, infude ainorem corbidus!
Я когда-то пробовал работать с большими числами. Все вычисления производил через массив целых чисел.
Вручную, конечно, можно пытаться составить какие-то функции, но гораздо приятнее работать с библиотеками типа GNU или BCMath, как в PHP. Там почти все функции уже готовы, осталось использовать по назначению. Но вот функции корня произвольной степени часто не бывает, и приходится делать самостоятельно. При этом это всё оказывается довольно медленно. А мне скорость очень важна - задача поиска решений трудоёмка в выч. плане
Accende lumen sensibus, infude ainorem corbidus!
Всё-таки, судя по всему, писать программы для работы с большими числами на Дельфи - не лучший вариант. Есть средства получше. Но на самом деле это очень интересно, повышает уровень программирования - ведь приходится максимально оптимизировать алгоритм, чтобы вычисления были быстрее. И есть много нерешенных проблем - за некоторые даже дают призы. Взять тот же Beal's Conjecture из теории чисел. Так что повод этим заняться есть.
Accende lumen sensibus, infude ainorem corbidus!
Однако если кто-то всё-таки сможет протестировать скорость работы функций для больших чисел в Дельфи, сообщите о результате. Я пока что сравнивал PHP и C#, и первый язык оказался быстрее - хотя это зависит больше от используемой библиотеки, а не самого языка.
Accende lumen sensibus, infude ainorem corbidus!
Конечно, проблемы из теории чисел интересны - интерес обычно подогревается большими призами. Но многие проблемы так и стоят по несколько десятилетий, а то и больше. Если хотите испытать себя, попробуйте найти решение для a^5+b^5+c^5=d^5 в целых положительных числах. Этого пока не смогли сделать, и неизвестно, есть ли вообще решение. smile;)
Я вот уже полтора года делаю различные скрипты для задач теории чисел, некоторые успехи были, но вот для нынешних моих проблем нужен C++ и 64-битный комп (я использовал PHP). Можно, наверно, и обычным обойтись, но хотелось бы именно максимальную скорость. Тут, наверно, Паскаль не может состязаться с C++. Хотя попробовать можно.
Accende lumen sensibus, infude ainorem corbidus!
motorway11
А на сколько большими числами вы оперируете?
Цитата
хотелось бы именно максимальную скорость

В этом случаи вам лучше использовать ассемблер. Я часто критичные по скорости участки программ пишу на ассемблере,а все остальное оставляю на delphi.
Цитата
sherlock2010 пишет:
попробуйте найти решение для a^5+b^5+c^5=d^5

Спасибо попробую, самому очень интересно.
Цитата
motorway11 пишет:
Я пока что сравнивал PHP и C#, и первый язык оказался быстрее

Честно говоря крайне удивлен результатом. Можно узнать подробнее о том как вы их сравнивали?
Цитата
Артём Кулинич пишет:
motorway11

А на сколько большими числами вы оперируете?

В зависимости от уравнения - от где-то 20-значных до 1000-значных примерно, возможно, и больше потребуется.
Accende lumen sensibus, infude ainorem corbidus!
Цитата
Алексей Смирнов пишет:
Цитата
хотелось бы именно максимальную скорость


В этом случаи вам лучше использовать ассемблер. Я часто критичные по скорости участки программ пишу на ассемблере,а все остальное оставляю на delphi.

На ассемблере не программировал (хотя в институте изучал немного). Там, наверно, довольно сложно будет всё это реализовать по сравнению с Дельфи. По крайней мере, для меня уж точно
Accende lumen sensibus, infude ainorem corbidus!
Цитата
Дмитрий Бороздин пишет:
Цитата
motorway11 пишет:

Я пока что сравнивал PHP и C#, и первый язык оказался быстрее


Честно говоря крайне удивлен результатом. Можно узнать подробнее о том как вы их сравнивали?

Например, делал циклы - перемножения, сложения и возведения в степень чисел от некоторой нижней границы до верхней. И было так, что на PHP это делалось за 10 сек, а на C# - 19. Наверно, это больше зависит от используемых библиотек для больших чисел - в PHP это BCMath, C# - там вышел класс System.Numerics.BigInteger, насколько я помню название. Получается, что последний не слишком удачный по ср. с PHP.
Accende lumen sensibus, infude ainorem corbidus!
Возможно, здесь сказывается какой-то фактор тяжеловесности при разработке в Visual Studio - только не очень понятно, какой. Вроде бы считается, что C# не обладает большой скоростью, а скорее, в нем делается упор на удобство программирования
Цитата
motorway11 пишет:
В зависимости от уравнения - от где-то 20-значных до 1000-значных примерно, возможно, и больше потребуется.

Тогда я не понимаю в чем у вас сложность. В Delphi есть тип extended, который позволяет оперировать числами почти в 5000 знаков.
Если программа с ним будет работать быстрее, чем указанные языки, то это хорошо, но будет ли? А сложность, в основном, в медленной работе программы - это если делать относительно простую программу перебора. Из-за этого поиск решений может идти очень долго в небольшом пространстве поиска. Также у меня есть и специальный быстрый алгоритм, написанный на C++ для 64-битного компьютера, которого у меня нет. Переписать его на другом языке тоже пока представляет сложность. Зато он позволяет искать решения в гораздо больших интервалах за то же время.
Поэтому я и пытался понять, можно ли обычный не очень сложный алгоритм поиска перенести на Дельфи, чтобы там было быстрее, чем на PHP. smile:oops:
Изменено: motorway11 - 24.04.2010 22:00:17
Accende lumen sensibus, infude ainorem corbidus!
Быстрее она будет работать или нет сказать не могу, но то что работать будет можно гарантировать.
Я попробовал возвести в степень число типа Extended, а потом привести к строковому виду, чтобы отобразить его. Получилось вместо целого числа число вида ...E+16. Может быть, это не совсем то, что нужно, или я что-то неправильно делаю? Есть ли у вас пример работы с ним - например, нужно возвести 32 в 32 степень?
Я делал так:
Код
var x: extended;
begin
x:=102;
Form1.Caption:=String(x*x*x*x*x*x*x*x);
Скачал бесплатный модуль для работы с большими числами, на немецком, называется TBigNum. Есть файл .pas, вот только не пойму, как использовать его в работе? Например, создаю форму, и нужно написать сложение 2 чисел. Давненько я не программировал на Дельфи чего-то большого (даже здесь не помню, как вставить этот файл в проект)smile:oops: Пробовал просто в файл с формой, которая создается, но там получается ошибка на строке с implementation.
UnitBigNum.pas (16.62 КБ) [ Скачать ]
Accende lumen sensibus, infude ainorem corbidus!
Нашёл еще одну библиотеку для больших чисел - BigInt. Она на английском и более дружелюбна к пользователю. Сейчас разбираюсь. Там хотя бы сразу видны примеры с длинными числами, что уже радует.
Accende lumen sensibus, infude ainorem corbidus!
Цитата
motorway пишет:
Код
var x: extended;
begin
x:=102;
Form1.Caption:=String(x*x*x*x*x*x*x*x);


Вообще странно что у Вас это работает. String вообще-то не функция и этот код даже не возможно скомпилировать
Цитата
Алексей Смирнов пишет:
Вообще странно что у Вас это работает. String вообще-то не функция и этот код даже не возможно скомпилировать

Правильно, дополню только что правильный код будет выглядеть вот так
Код
var x: extended;
begin
x:=102;
Form1.Caption:=FloatToStr(x*x*x*x*x*x*x*x);
Еще правильнее так
Код
var x: extended;
begin
x:=102;
Form1.Caption:=FloatToStr(Power(x,8));
Страницы: 1 2 3 4 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)