![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
Каким образом в php можно возводить в степень большие целые числа и складывать их?
![]() Например, нужно вычислить p^m1+q^m2+r^m3, где все числа достаточно большие, так что приходится использовать представление в виде строк. На входе 3 числа и 3 степени, на выходе результат вычисления. Это сообщение отредактировал(а) motorway - 5.11.2008, 21:51 -------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
ekianu |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 7.11.2006 Репутация: нет Всего: нет |
если bcmath медлить, то используй gmp. |
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
респект
![]() -------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
а как лучше всего проверять, является ли корень из большого числа целым числом?
-------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Поискать в строковом представлении букву E или символ '.'
Imho, bcmath все равно работает со строками... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
а как извлечь корень нормально из большого числа?
-------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
NLspieler |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Недавно писал библиотеку функций, для моей решалки уравнений. Как раз есть то, что тебе нужно!
Что значит нормальное извлечение корня? |
||||||
|
|||||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
Как извлечь корень произвольной степени из большого числа с помощью BCMath? Напр., корень 5-й степени.
-------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
NLspieler |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
|
||||
|
|||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
у меня такая штука выводит 1. В мануале был коммент, что эта функция не может исп. с дробными степенями :(
-------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Да, проверил, и правда не работает.
Но отчаиватся не стоит, есть функция bcsqrt, которая извлекает квадратный корень. Если хорошенько напрячь мозг, то можно найти алгоритм нахождения любого натурального корня, используя только эту функцию. Если придумаю, запощу здесь результат. |
|||
|
||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 10 Всего: 12 |
NLspieler, на сколько я знаю, это не возможно сделать
|
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 5 Всего: 454 |
Подбором, собсно... с заданной точностью.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Корень n-й степени из числа a, где e = 2.718... (Число Эйлера), а Ln() - натуральный логарифм.
Форумулы расчета натурального логарифма можете найти сами в сети ![]() Добавлено через 1 минуту и 59 секунд А можете воспользоваться таблицами. Добавлено через 4 минуты и 40 секунд Вот кстати, готовое решение для Ln() http://ua2.php.net/manual/en/function.bcpow.php первый же пример. |
|||
|
||||
NLspieler |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Если бы была бы возможность возводить bc числа в дробную степень, то тогда было бы вполне достатоно использовать формулу
Но так как, bcpow не может возводить число в дробную степень, поэтому нужно искать другое решение. Подбором, это как то не спортивно, да и времени займет недопустимо много. Извлекать корни 2, 4, 8, 16, 32 и т.д. при помощи bcsqrt не составляет труда. Если удастся найти натуральное число x
то тогда задача будет решена. Вопрос в том, существует ли подходящее число для любого натурального s. Если нет, то задача и вправду не разрешимая таким методом. Это сообщение отредактировал(а) NLspieler - 25.9.2009, 17:21 |
||||
|
|||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Жесть. Вы прикидываетесь? Или не учили математику? Вам подсказать как получить X в степени 2.2? 1. Раскладываем на Х^2 * X^0.2 2. X^2 3. X^0.2 - это корень. 4. Отсюда имеем X^0.2 = e^(1/0.2 * Ln(X)) = e^(5*Ln(X)) 5. Если 5*Ln(X) у нас не целое число - идем пункт 1. 6. Считаем произведение. На пункте 5 мы можем поставить проверку на точность. т.е. после определенной иттерации просто округлить результат до целого. Это сообщение отредактировал(а) Simpliest - 25.9.2009, 17:36 |
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
А что можете сказать про такое решение, возможно, неверное (не мое):
-------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
у pow точность ограничена 14 или 16 знаков для double (точно не помню).
Тебе же надо БОЛЬШИЕ числа ![]() |
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
ну да. В общем, если у кого-то будет протестированная 100%-но функция для таких вещей, будет хорошо.
-------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Simpliest,
замечательно! Если вы разобрались как решить эту ![]() найдите несколько минут, что бы написать соответствующую функцию. Которая должна уметь извлекать корень любой степени из чисел навроде: 2983742634876182736817263928374982374109238098798172837682734682653472534 с точностью до 500 знаков после запятой. Добавлено через 2 минуты и 18 секунд
А зачем тебе такая функция, если не секрет? Нанотехнологии? Но для них даже функции pow вполне достаточно. |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
||||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
Иногда эстетическое наслаждение представляет просто выложить функцию на обозрение мирового сообщества
![]() -------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Мое эстетическое наслаждение заключается в непотакании бездарным лентяям. Я дал готовый алгоритм, написать функцию дело 15ти минут. |
|||
|
||||
NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Simpliest,
Я вот что не могу понять. Почему, сначала формула была такой: Корень = e^((1/n) * Ln(a)), где n - степень корня, а - число, но внезапно стала такой: X^n = e^(1/n * Ln(а)) ? Другой вопрос в том, может ли y*Ln(x) быть целым числом? Если нет, то нужно повторить пунк 1? Но с какими значениями? |
|||
|
||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 56 Всего: 146 |
Мне непонятно почему X^0.2 = e^(1/0.2 * Ln(X)) ? Ты, наверное, хотел сказать корень 5 степени от X равен e^(1/5 * Ln(X)) = e^(0.2 * Ln(X)) ? Но тогда очевидно, что данный алгоритм не будет работать, т.к. n будет всегда дробным. Это сообщение отредактировал(а) sTa1kEr - 25.9.2009, 19:12 |
|||
|
||||
NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Ну должен же быть способ, полюбому должен!
|
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
пока что приходят мысли о представлении числа в виде x*10^k, а дальше корень извлекается из x, которое должно быть небольшим, и из 10^k каким-то образом. Но, скорее всего, это 10^k тоже будет большим, так что не знаю...
Это сообщение отредактировал(а) motorway - 25.9.2009, 19:43 -------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Да, возможно, где-то ошибка ![]() Момент. Добавлено через 6 минут и 40 секунд Так. В приведении формул была ошибка. sTa1kEr, прав. Правильный вид он указал Дальше у нас есть два варианта
Для второго случая надо подумать. |
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
Я что-то весьма сомневаюсь, что это будет целым числом для каких-то случаев. ln x - иррационально для рационального x. Так что я не бездарный лентяй, а просто реализовывать предложенную функцию, пока она не проверена автором, не хочется. Это сообщение отредактировал(а) motorway - 25.9.2009, 21:43 -------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
А там не надо сомневаться. Оно практически всегда будет нецелым. Но проведя "надцать" иттераций вы получите приемлимую сходимость. |
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
В таком случае, может, поискать уже готовое решение для этой проблемы в другом ключе?
-------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Ищите
![]() |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Так, задачка решена С оставшейся дробной степенью мы поступаем следующим образом. 1. Домножаем еще на 2/2 до тех пор пока она не станет больше 1 2. 0.2*Ln(X) * 2/2 * 2/2 * 2/2 = 1.6 * Ln(X) / 8 = Ln(X) / 8 + 0.6 * Ln(X) /8 небольшое уточнение, естественно раскладывать в п.2 нам надо на целую и дробную часть, а не на 1*Ln(X) и 0.6 * Ln(X) Т.е. мы должны получить что-то вида C/8 + D/8, где С - целое, а D - дробное. 3. Левую часть мы уже можем считать. Для этого возводим e в полученную степень (С) и извлекаем квадратный корень, столько раз, сколько домножали на 2/2 (в нашем примере 3 раза) 4. Правую прогоняем через п.1. 5. Потом считаем произведение полученного ряда. 6. И так до тех пор пока не достигнем приемлимой точности.
Если вы не бездарный - то придумаете/вспомните формулу. Если вы не лентяй - то реализуете по предложенному алгоритму. Но вы не делаете ни того, ни другого, а просите других решить это за вас. Все просто и выводы каждый сделает для себя. |
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
Я собственно не просил решать это за меня, а просил подсказать готовое решение, используемое другими программистами в этом случае. Вряд ли каждый будет делать таким способом. Я просто думал, что если кто знает, как это уже сделано, то может выложить. Возможно, этот алгоритм единственный, и по-другому нельзя. Но вполне возможно, есть более простой и эффективный способ это сделать.
В первом случае в нем была ошибка, поэтому я и не торопился сразу бежать кодировать, пока автор не убедился в правильности предложенной вещи Это сообщение отредактировал(а) motorway - 26.9.2009, 22:45 -------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Попробовал алгоритм, аноличный алгоритму, который предложил
товарищ Simpliest, оказалось, что точность недопустимо низкая, а время выполнения необычайно высокое. Поискал в интернете, есть алгоритм извлечения корня столбиком. Возможно, функции sqrt, pow, извлекают корени подобным образом. Если не удастся придумать что то более продуктивное, то попробую реализовать стобиковый алгоритм. |
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
По идее, те, кто делал PHP, должны знать. Только у кого конкретно это спросить?
-------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
motorway, ты понял, что сказал?
|
|||
|
||||
motorway |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 578 Регистрация: 2.3.2008 Репутация: 1 Всего: 0 |
А что я такого сказал? Кто-то из разработчиков делал эти функции, поэтому он должен знать, как решается мой вопрос. Но кто их делал, я не знаю
-------------------- Russian Pascal Developer Network - Сеть разработчиков на языке программирования Pascal/Object Pascal Форум Delphi/Kylix, Free Pascal Compiler/Lazarus, PascalABC.NET Онлайн-кинотеатр |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |