Авторизация

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

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

Страницы: Пред. 1 2 3 4
Работа с большими числами в Pascal
Цитата
Виктор Кузьмин пишет:
Проблема вычисления больших чисел заключается в том, что его нельзя сразу засунуть в регистр, поэтому приходится складывать или что там еще требуется делать по частям, поэтому и получается так долго. Я попробую чуть позже написать код для работы с большими числами.

Согласен, но ведь с ними же научились работать. Пусть и так хотя бы. Кстати, если у вас получится, можете попробовать сделать код для перебора a^5+b^5+c^5=d^5, где a,b,c будут в диапазоне 1-1000, к примеру. Хотя решений здесь нет в этом диапазоне, насколько я знаю.
Accende lumen sensibus, infude ainorem corbidus!
А вообще стало что-то очень интересно, motorway11 вы можете использовать у себя на компьютере программу с переменными типа int64?
Изменено: Михаил Сидоров - 06.05.2010 16:57:32
Для этого не нужна 64-битная архитектура? smile;) У меня уже просто неразбериха небольшая в голове получается. Специально вошел в Visual Studio проверить, там такая возможность есть на C#. Значит, и в Дельфи теоретически может быть. А у вас какая-то идея возникла?
Accende lumen sensibus, infude ainorem corbidus!
Цитата
motorway11 пишет:
можете попробовать сделать код для перебора a^5+b^5+c^5=d^5, где a,b,c будут в диапазоне 1-1000, к примеру. Хотя решений здесь нет в этом диапазоне, насколько я знаю.
Решения здесь действительно нет,а код простейший
Код
var a,b,c,d:integer;
const min=1; max=1000;
begin
for a:=min to max do
  for b:=min to max do
    for c:=min to max do
      for d:=min to max do
        if IntPower(a,5)+IntPower(b,5)+IntPower(c,5)=IntPower(d,5) then
          ShowMessage('a='+IntToStr(a)+' '+'b='+IntToStr(b)+' '+'c='+IntToStr(c)+' '+'d='+IntToStr(d));
ShowMessage('Решения не существует');
Нет, никаких новых идей не возникла, но до 2^63-1 вы можете считать без использования дополнительных модулей для работы с большими числами,а это намного быстрее.
Цитата
motorway11 пишет:
Я бы и сам рад доказать, но это задачи из сложнейших - такого рода проблемы остаются нерешенными по несколько десятилетий. Доказательство Уайлса около 100 страниц и изобилует сверхсложной математикой - даже профессионалам оно не сразу понятно, и мало кто в этом разбирается полностью. Что уж говорить обо мне, ведь я только любитель в теории чисел. Но, ради справедливости, я просматриваю новые статьи по теории чисел на эту тему.
Я это знаю,а так же то что его доказательство носит вероятностный характер, поэтому мнение многих ученых по этому вопросу разделились.
Цитата
Артём Кулинич пишет:
Решения здесь действительно нет,а код простейший

При этом такой код не эффективен потому, что вычисленное число слева является конкретным числом для данных a,b,c и нет смысла проверять его для всех d на равенство. Нужно просто взять корень 5-й степени и посмотреть, целое ли это число. Хотя как раз с функцией корня бывают проблемы.
А потом уже можно оптимизировать - всякие остатки добавлять, другие соображения.
Accende lumen sensibus, infude ainorem corbidus!
Цитата
Иван Прокофьев пишет:
Цитата
motorway11 пишет:

Я бы и сам рад доказать, но это задачи из сложнейших - такого рода проблемы остаются нерешенными по несколько десятилетий. Доказательство Уайлса около 100 страниц и изобилует сверхсложной математикой - даже профессионалам оно не сразу понятно, и мало кто в этом разбирается полностью. Что уж говорить обо мне, ведь я только любитель в теории чисел. Но, ради справедливости, я просматриваю новые статьи по теории чисел на эту тему.
Я это знаю,а так же то что его доказательство носит вероятностный характер, поэтому мнение многих ученых по этому вопросу разделились.

Неужели и здесь теорема доказана с вероятностью 90%? smile:D Как это может быть, интересно? Должно же быть точно... Нужно снова перечитать статьи на эту тему. Вот поэтому мне нужна абсолютная точность при вычислениях smile:)
Accende lumen sensibus, infude ainorem corbidus!
Ну согласен, можно так усовершенствовать, только смысл от этого не изменится.
В общем, осталось теперь сделать такой код для чисел произвольной длины, и пока задача минимум будет выполнена. Смысл как раз в этом, так как для небольших чисел всё уже успели проверить.
Accende lumen sensibus, infude ainorem corbidus!
Для больших числе нужно использовать сначала не точные вычисления и только в случаи если при неточном вычислении получится равенство проверить еще раз, но уже с более точно.
Вот нашел на другом форуме, модуль для работы с числами произвольной длинны, сам еще не проверял.
chisla.rar (4.93 КБ) [ Скачать ]
Интересно отметить, что в пакетах типа Maple, Mathematica решение таких уравнений идет медленно, и часто не получается найти решение для простых уравнений, в то же время обычные скрипты/программы перебора находят их. Этим отчасти, конечно, объясняется присутствие большого числа всяких модулей для работы с большими числами, однако, с ними не всегда легко разобраться.
Изменено: motorway11 - 06.05.2010 19:00:42
Accende lumen sensibus, infude ainorem corbidus!
А LongInt вам не катит?
свободный страннык
Нет, мне же нужны числа с произвольным количеством знаков. А здесь только ограниченные будут. Все типы с ограниченным числом мне не подходят smile;)
Accende lumen sensibus, infude ainorem corbidus!
В математике бывает бесконечность, но вот в программировании нет такого понятия как бесконечность. Вот если ты сможешь конечно сделать быструю обработку 13 Терабайтного числа (и это ведь тебе мало), то возможно ты приблизишься к своей бесконечности, но это все равно будет не бесконечность. Так что забудь про эту бредовую идею.
свободный страннык
Я понимаю это прекрасно. И с бесконечностью сражаться не хочу. Но я говорю о том, что мне нужно использовать тип данных, не ограниченный явно каким-то числом, как это бывает у Int64 и т.п. Я использую библиотеку для работы с большими числами, и там явно нет ограничений на максимальное число. Понятно, что при какой-то длине комп заткнётся, но с несколькими тысячами знаков можно вполне работать. Об этом и говорю.
Accende lumen sensibus, infude ainorem corbidus!
Все эти библиотеки обычно называются arbitrary precision numbers, или big integers, и в них можно вводить произвольные числа. Без них задачи типа определения максимально известного простого числа было бы очень сложно (или невозможно) сделать, ведь на одном Int32 (64) не уедешь - при попытке ввести большое число будет ошибка. А тут сделано так, что это вводить можно. Пусть и внутри используются какие-то уже готовые типы
В принципе, объясните суть использования таких чисел, и может быть я смогу придумать вам замену
свободный страннык
Думаю, замена тут не нужна. Я довольствуюсь такими числами, работаю с ними с помощью готовых библиотек. Суть вроде бы уже пояснил выше, там все прозрачно. Например, нужно найти корень уравнения a^5+b^5+c^5=d^5. При этом в небольших диапазонах его нет, а нужно перейти к перебору для БОЛЬШИХ чисел. Тут просто не хватит встроенных типов. Например, вам надо посчитать 1234567890123456789^5. Как это сделать обычными способами? Даже если можно, то лучше использовать удобные вещи
Accende lumen sensibus, infude ainorem corbidus!
можно использовать динамичный массив, написать множество функций для работы с ним и т.д.
свободный страннык
Я написал автору библиотеки FGInt еще одно письмо, но он не ответил... пока что у меня не дошли руки до реализации на Дельфи программы для поиска с помощью нее корней для уравнений вида a^5+b^5+c^5=d^5, поэтому предлагаю, если кто захочет, выкладывать код для этого сюда. smile:!:
Accende lumen sensibus, infude ainorem corbidus!
Итак, господа, есть ли у кого-нибудь идеи, как можно сделать эффективный алгоритм для перебора корней a^5+b^5+c^5=d^5? В основном я применял разные фильтры по остаткам, но это не сильно увеличивает скорость. Но я видел алгоритмы для похожих задач, где получается сделать неплохое решето, и там фильтр гораздо лучше, так что считается гораздо быстрее.
Там как-то использовались простые числа.
Accende lumen sensibus, infude ainorem corbidus!
Страницы: Пред. 1 2 3 4
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)