Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Корень квадратный из двух

19K
03 февраля 2007 года
Некромант
23 / / 05.12.2006
Как вычислить корень квадратный из двух с точностью до 1000000 знака за 10 секунд? Мне не нужно простое перечисление методов (которых я знаю очень много). Если вы знаете какой-либо метод, содержащий умножение дробных чисел большой точности (пример ниже), распишите пожалйуста, как перемножать эти числа?
Пример одного из методов (квадратичное приближение):
x0 = 1/2, x(n+1) = x(n) * (3/2 - x(n)^2) - находим sqrt(2)/2
Заранее спасибо.
63
03 февраля 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: Некромант
Как вычислить корень квадратный из двух с точностью до 1000000 знака за 10 секунд? Мне не нужно простое перечисление методов (которых я знаю очень много).


А что вам нужно? Готовый код с комментариями? Тогда прошу перенести тему в раздел Студентам.
Если нет - то тут , думаю, достаточно подробно расписано.

Цитата: Некромант

Если вы знаете какой-либо метод, содержащий умножение дробных чисел большой точности (пример ниже), распишите пожалйуста, как перемножать эти числа?


А чем отличается умножение дробных чисел большой точности от просто больших длинных чисел в терминах длинной арифметики? Просто храните в дополнительных структурах информацию о положении запятой. А в приведенном тобой примере я никакой "большой" точности не вижу. Обычный численный метод. Что ты подразумеваешь под "большой"? Сколько знаков?

19K
03 февраля 2007 года
Некромант
23 / / 05.12.2006
Цитата: Zorkus
А что вам нужно? Готовый код с комментариями? Тогда прошу перенести тему в раздел Студентам.
Если нет - то тут , думаю, достаточно подробно расписано.


Пример по ссылке не подходит, поскольку там необходимо инвертирование большого (500000 знаков) числа, а это очень долго. Исходников мне не нужно, мне нужен метод вычисления. Пример:
sqrt(2) = (239/169)*sqrt(2*169^2 / 239^2) = (239/169)*1/sqrt(1-1/57122)
Вычисление 1/sqrt(1-1/57122).
1/sqrt(1-x) = 1+(1/2)x+(1*3)/(2*4)x^2+(1*3*5)/(2*4*6)x^3+...
Числа 239 и 169 взяты из цепных дробей. Объясню, почему этот метод не подходит. За одну итерацию мы получаем всего четыре-пять цифр корня из двух, поэтому придется делать около 200000 итераций с делением и умножением длинных чисел. Если кто знает более быстро сходящиеся ряды, пожалуйста напишите. В раздел Студентам эту тему кидать нет смысла, поскольку студентам такой алгоритм вряд ли понадобится когда-нибудь (им чаще всего достаточного хоть какого-нибудь алгоритма, без ограничений по времени).

Цитата: Zorkus
А чем отличается умножение дробных чисел большой точности от просто больших длинных чисел в терминах длинной арифметики? Просто храните в дополнительных структурах информацию о положении запятой. А в приведенном тобой примере я никакой "большой" точности не вижу. Обычный численный метод. Что ты подразумеваешь под "большой"? Сколько знаков?


Под словом большой я подразумеваю 1000000 знаков. Согласен, что умножение дробных чисел похоже на умножение целых, но как умножать целые числа большой длины? Если умножать обычным способом, без специальных методов, это займет около 10 секунд на вычисление одного умножения, что мне явно не подходит. Поэтому я и прошу мне помочь.

63
03 февраля 2007 года
Zorkus
2.6K / / 04.11.2006
Хм. Я думал, ты имеешь в виду несколько другое:). Навскидку могу предложить попробовать биномиальный ряд Тейлора (1+x)^m (инфу найдешь в любом учебнике по матану или в гугле).
19K
03 февраля 2007 года
Некромант
23 / / 05.12.2006
Навскидку такой вопрос не решить. А биномиальный ряд сходится слишком медленно (то, что я привел, пока что самый оптимальный вариант из рядов Тейлора, но и он сходится недостаточно быстро, всего 4 знака за итерацию), поэтому нужно что-то еще. Я уже выбился из сил искать другие возможности, поэтому прошу о помощи. Либо мне нужно перемножение двух длинных чисел как максимум за 1 секунду.
63
04 февраля 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: Некромант
Я уже выбился из сил искать другие возможности, поэтому прошу о помощи.

Как будет время, поищу разные ряды еще.

Цитата: Некромант

Либо мне нужно перемножение двух длинных чисел как максимум за 1 секунду.


А ты уверен,что правильно понял задание? Просто время, которые ты указал, оно при данных тобой условиях будет на разном железе сильно расбрасываться. И алгоритм, годный для одной машины, на 9 сек, на другой выдаст полминуты.

19K
04 февраля 2007 года
Некромант
23 / / 05.12.2006
Машина достаточно быстрая для этой задачки. Проц около 1 ГГц
361
04 февраля 2007 года
Odissey_
661 / / 19.09.2006
Могу посоветовать посмореть библиотеку GMP. Она free и с исходным кодом. Работает с большими числами. Гаратирует сложность предлагаемых алгоритмов от O(M(n)log(n)) к O(M(n). Вообщем посмотри сам здесь.
Открытый код, глянешь оттуда алгоритм работы и структуры данных для представления больших чисел.
Для перемножения двух больших чисел, там помоему БПФ используется. Если нужно быстрее посмотри насчет АГС-алгоритмов.
Посмотри насчет формулы Чудновского. Может он нетолько для числа пи формулу вывел быстрого расчета с заданной точностью.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог