Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> квадратный корень из большого числа, BigInteger+что делать, если его нет 
V
    Опции темы
motorway
  Дата 7.12.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: -1
Всего: 0



Вопрос состоит из 2 частей, т.к. отсутствие одного пути влечет за собой переход к другому.

В C# есть такая штука: структура System.Numerics.BigInteger для работы с большими числами. Вот только там нет среди методов функции взятия корня. Степени только целые есть.
И какой же метод использовать, если нужно взять корень?
Ну допустим, что корня нет. Тогда мы можем сделать таблицу со значениями квадратов чисел. И дальше искать по ней на совпадение.
Например, если число имеется в таблице, то мы знаем, что корень из него - целое число.
Насколько быстр поиск по такой отсортированной таблице?
Например, у меня есть таблица квадратов чисел от 1 до миллиарда, и мне нужно проверить, есть ли там это число.
Как лучше такую таблицу хранить в C#, и как искать по ней? Быстрее ли это будет, чем брать корень?
PM MAIL   Вверх
source777
Дата 7.12.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Вообще-то есть куча более разумных алгоритмов вычисления квадратного корня, чем поиск по таблице квадратов, вот парочка методов из
википедии, хотя я советую использовать метод Ньютона, не зря он на уровне процессора используется, ибо очень быстрая сходимость у него.

Это сообщение отредактировал(а) source777 - 7.12.2009, 20:03


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
motorway
Дата 7.12.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: -1
Всего: 0



Меня интересует самый быстрый метод из имеющихся в наличии готовых. Насколько сильно отличается быстродействие поиска по таблице и таких методов? Вы знаете готовые функции извлечения корня?
Кстати, понадобится могут и другие корни, не только квадратные.

Добавлено через 3 минуты и 22 секунды
По сути, проверка по таблице квадратов позволяет проверить, целый ли корень, а само число не обязательно нужно. Мне так и нужно для начала.
PM MAIL   Вверх
source777
Дата 7.12.2009, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(motorway @  7.12.2009,  20:11 Найти цитируемый пост)
Меня интересует самый быстрый метод из имеющихся в наличии готовых. 

"Самый быстрый" это не математическое понятие, понятно же, что многое зависит от числа, корень которого надо найти.
Но метод Ньютона определённо один из самых быстрых для больших N. Кроме того он подходит для поиска действительных корней практически любого уравнения, а уравнение для вычисления квадратного корня x*x - N = 0  это лишь частный случай.
Вот пример применения этого метода конкретно для вычисления квадратного кода: http://e-maxx.ru/algo/roots_newton


Это сообщение отредактировал(а) source777 - 7.12.2009, 21:53


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
motorway
Дата 7.12.2009, 22:14 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: -1
Всего: 0



Спасибо. Еще бы понять, как переделать этот алгоритм на C# с использованием имеющихся в распоряжении функций.
PM MAIL   Вверх
source777
Дата 7.12.2009, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(motorway @  7.12.2009,  22:14 Найти цитируемый пост)
Еще бы понять, как переделать этот алгоритм на C# с использованием имеющихся в распоряжении функций. 

Ты видимо имел в виду "записать", что-то переделывать там нет необходимости. А уж записать готовый алгоритм на известном тебе языке программирования... что может быть проще? Разве что только тупой копи-паст, но это уже недостойное занятие для программиста.  smile 

Цитата(motorway @  7.12.2009,  22:14 Найти цитируемый пост)
Спасибо.

Пожалуйста, не забываем плюсовать и помечать тему как решённую.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
motorway
Дата 7.12.2009, 22:49 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: -1
Всего: 0



Дело в том, что опыт кодирования на C# у меня не очень большой, тем более с использованием BigInteger. И сразу написать это не получится, т.к. в Visual Studio нужные методы не показываются. Типа ShiftLeft, как в том примере на Java.
Пока что для меня этот алгоритм - один из вариантов, и, наверно, буду еще смотреть, как решать эту задачу.
В любом случае, пока этот пример мне не очень помог, т.к. он на другом языке, а возможности BigInteger в C# позволяют делать только определенные вещи.

Это сообщение отредактировал(а) motorway - 7.12.2009, 23:02
PM MAIL   Вверх
source777
Дата 7.12.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(motorway @  7.12.2009,  22:49 Найти цитируемый пост)
В любом случае, пока этот пример мне не очень помог, т.к. он на другом языке, а возможности BigInteger в C# позволяют делать только определенные вещи.

Ну это уже не серьёзно, ты документацию читать никогда не пробовал? 
System.Numerics.BigInteger members  smile 
или если в .NET метод называется LeftShift, а не ShiftLeft, то это делает его абсолютно невидимым???

Это сообщение отредактировал(а) source777 - 7.12.2009, 23:16


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
motorway
Дата 7.12.2009, 23:32 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: -1
Всего: 0



Действительно, в операторы я не смотрел, т.к. думал, что нужен именно метод.

Добавлено через 41 секунду
Ну и в VS его не видно было

Добавлено через 1 минуту и 59 секунд
И все-таки гуру сварганит этот небольшой код за гораздо меньшее время, чем я  smile 
PM MAIL   Вверх
motorway
Дата 7.12.2009, 23:50 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: -1
Всего: 0



Пока что вообще не понял, как использовать этот оператор ShiftLeft
PM MAIL   Вверх
diadiavova
Дата 7.12.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



motorway, вообще-то в типе BigInteger есть ещё логарифмы. Все операции со степенями можно и через логарифмы выразить. Например возьмём десятичные логарифмы(хоть это и необязательно). Любое число n можно представить как
10^lg(n)
Здесь ^ - оператор возведения в степень

Стало быть если тебе надо получить квадратный корень - раздели показатель на 2 и будет тебе счастье
То есть твоё число будет равно 10^(0.5*lg(n))



Это сообщение отредактировал(а) diadiavova - 7.12.2009, 23:55


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
motorway
Дата 8.12.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: -1
Всего: 0



Но там же можно возводить только в целую степень!
PM MAIL   Вверх
diadiavova
Дата 8.12.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(motorway @  8.12.2009,  00:01 Найти цитируемый пост)
Но там же можно возводить только в целую степень! 

Но ведь 10 может быть int smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
motorway
Дата 8.12.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: -1
Всего: 0



Если корень из моего числа также большое число BigInteger, то проблема остается.
PM MAIL   Вверх
diadiavova
Дата 8.12.2009, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(motorway @  8.12.2009,  00:06 Найти цитируемый пост)
Если корень из моего числа также большое число BigInteger, то проблема остается.

Ну это конечно. Хотя если немного помозговать с логарифмами, то и эту проблему решить видимо можно. В любом случае мой способ даст тебе первые 15 или 16 цифр результата и порядок. А уточнить результат можно и методом касательных, о котором упоминал source777, только для более быстрой сходимости его обычно комбинируют с методом хорд(поищи в том же источнике).Хотя это в математике работет быстрее, а на компе - фиг знает smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0545 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.