Как сделать корень в питоне

Добавил пользователь Валентин П.
Обновлено: 05.10.2024

Есть ли где-нибудь в Python или в стандартных библиотеках целочисленный квадратный корень? Я хочу, чтобы он был точным (т.е. возвращал целое число), и лаял, если решения нет.

На данный момент накатил свой наивный:

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

Ответы

Метод Ньютона отлично работает с целыми числами:

Это возвращает наибольшее целое число x, для которого x * x не превышает n . Если вы хотите проверить, является ли результат точным квадратным корнем, просто выполните умножение, чтобы проверить, является ли n точным квадратом.

Я обсуждаю этот алгоритм и три других алгоритма вычисления квадратных корней в своем блоге .

Обновление: Python 3.8 имеет функцию math.isqrt в стандартной библиотеке!

Я протестировал здесь каждую (правильную) функцию как на малых (0… 2 22 ), так и на больших (2 50001 ) входах. Явными победителями в обоих случаях являются gmpy2.isqrt предложенные mathmandan на первом месте, за которыми следует Python 3.8 math.isqrt на втором, а на третьем - рецепт ActiveState, связанный с NPE . В рецепте ActiveState есть несколько разделов, которые можно заменить сдвигами, что делает его немного быстрее (но все еще отстает от собственных функций):

    : маленький 0,08 мкс, большой 0,07 мс
  • int(gmpy2.isqrt()) *: маленький 0,3 мкс, большой 0,07 мс
  • Python 3.8 math.isqrt : маленький 0,13 мкс, большой 0,9 мс
  • ActiveState (оптимизировано, как указано выше) : 0,6 мкс малый, 17,0 мс большой : 1,0 мс малый, 17,3 мс большой : 4 мкс малый, 80 мс большой : 2,7 мкс малый, 120 мс большой (с этой поправкой ): маленький 2,3 мкс, большой 140 мс : 8 мкс малый, 1000 мс большой : малый 1,8 мкс, большой 2200 мс : 1,5 мкс малый, 19000 мс большой : 1,4 мкс малый, 20000 мс большой

(* Поскольку gmpy2.isqrt возвращает объект gmpy2.mpz , который ведет себя в основном, но не совсем как int , вам может потребоваться преобразовать его обратно в int для некоторые виды использования.)

Извините за очень поздний ответ; Я только что наткнулся на эту страницу. На случай, если кто-то посетит эту страницу в будущем, модуль python gmpy2 разработан для работы с очень большими входными данными и включает, среди прочего, функцию целочисленного квадратного корня.

Конечно, все будет иметь тег "mpz", но теги mpz совместимы с тегами int:

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

Алгоритм длинного квадратного корня

Оказывается, есть алгоритм вычисления квадратных корней, который можно вычислить вручную, что-то вроде деления в длину. Каждая итерация алгоритма производит ровно одну цифру полученного квадратного корня, используя две цифры числа, квадратный корень которого вы ищете. Хотя "длинная" версия алгоритма указана в десятичной системе счисления, она работает с любой базой, причем двоичный код является наиболее простым для реализации и, возможно, самым быстрым для выполнения (в зависимости от базового представления bignum).

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

На сайте "Dr. Math" есть две интересные статьи, объясняющие алгоритм:

А вот реализация на Python:

Вы можете легко изменить эту функцию, чтобы проводить дополнительные итерации для вычисления дробной части квадратного корня. Больше всего меня интересовало вычисление корней из больших полных квадратов.

Вот очень простая реализация:

Это просто бинарный поиск. Инициализируйте значение m как наибольшую степень двойки, не превышающую квадратный корень, затем проверьте, можно ли установить каждый меньший бит, сохраняя результат не больше квадратного корня. (Проверяйте биты по одному в порядке убывания.)

Для достаточно больших значений n (скажем, около 10**6000 или около 20000 битов) это выглядит следующим образом:

  • Быстрее, чем реализация метода Ньютона, описанная пользователем448810 .
  • Намного, намного медленнее, чем встроенный метод gmpy2 в моем другом ответе .
  • Сравним с Длинным квадратным корнем, описанным Ниботом , но несколько медленнее.

Все эти подходы успешны для входов такого размера, но на моей машине эта функция занимает около 1,5 секунд, в то время как @ Nibot занимает около 0,9 секунды, @ user448810 занимает около 19 секунд, а встроенный метод gmpy2 занимает менее миллисекунды. (!). Пример:

Эту функцию легко обобщить, хотя это не так хорошо, потому что у меня нет столь точного первоначального предположения для m :

Однако обратите внимание, что gmpy2 также имеет метод i_root .

Изменить: спасибо @Greggo за указание на то, что функцию i_sqrt можно переписать, чтобы избежать использования каких-либо умножений. Это дает впечатляющий прирост производительности!

Обратите внимание, что по конструкции бит k th в m не установлен, поэтому побитовое или может использоваться для реализации добавления (m . В конечном итоге у меня есть (2*m*(2**k) + 2**(2*k)) записанное как (((m , так что это три сдвига и одно побитовое ИЛИ (с последующим вычитанием, чтобы получить new_diff ). Может есть еще более действенный способ получить это? Тем не менее, это намного лучше, чем умножение m*m ! Сравните с приведенным выше:

В Python 2.7.8 не получается найти корень квадратный и экспоненту.

@Валентина, Если вам дан исчерпывающий ответ, отметьте его как верный (нажмите на галку рядом с выбранным ответом).

Как уже написали ранее, можно воспользоваться функциями из стандартного модуля math . Для этого его нужно подключить к программе. Использование выглядит следующим образом:

При желании можно использовать и без префикса, в таком случае можно использовать другой синтаксис импорта:

Для того, чтобы найти квадратный корень, можно ещё использовать оператор возведения в степень или функцию pow (так как квадратный корень это возведение в степень 0.5):

Для этого нужно использовать циклы или что-то еще? Если известно только число, а корни надо найти.

Оценить 1 комментарий

aRegius

Существует три способа вычисления квадратных корней: с помощью функции sqrt() модуля math, с помощью выражения ** и с помощью встроенной функции pow(). В данном случае я указал их в порядке снижения скорости вычисления. Т.е. быстрее других считает sqrt(), потом **, потом pow(). С другой стороны, отмечу, что для работы с sqrt() необходимо импортировать модуль math, а ** и pow() доступны сразу:


Если вы не гений математики, вы не запомните все квадратные корни. И даже если вы это сделали, кто-то другой, смотрящий на ваш код, может не знать, что вы. Это означает, что им, возможно, придется перепроверить, что вы написали правильные квадратные корни & mdash; это просто повторная работа.

Если вы использовали функцию извлечения квадратного корня Python, очевидно, что вычисляется квадратный корень. Другой человек, просматривающий ваш код, знает, что он точен. В качестве дополнительного бонуса никому не нужно открывать свой калькулятор! & Nbsp;

Что такое Python sqrt ()?

Используете ли вы теорему Пифагора или работаете над квадратным уравнением, Функция извлечения квадратного корня в Python & mdash; sqrt () & mdash; может помочь вам решить ваши проблемы. Как вы уже догадались, sqrt () вернет квадрат числа, переданного вами в качестве параметра.

sqrt () Метод может быть полезным, потому что он быстрый и точный. В этом кратком руководстве рассматривается, что вы можете передать в качестве параметра в sqrt () , способы обхода недопустимых параметров и пример, который поможет вам понять. Вы можете получить квадратный корень из числа, возведя его в степень 0,5 с помощью оператора экспоненты Python (**) или функции pow () .

Когда вы работаете с несколькими числами, требующими квадратного корня , вы обнаружите, что использование функции sqrt () более элегантно, чем использование нескольких операторов экспоненты с & ldquo; 0,5 & rdquo ;. Кроме того, это более понятно. Можно легко забыть или пропустить лишнюю звездочку (& lsquo; * & rsquo;), которая полностью превратит оператор в оператор умножения, что даст вам совершенно другой результат.

Синтаксис функции квадратного корня Python

Общий синтаксис, используемый для вызова функции sqrt () :

В приведенном выше фрагменте кода & ldquo; x & rdquo; - это число, квадратный корень которого вы хотите вычислить. Число, которое вы передаете в качестве параметра функции извлечения квадратного корня, может быть больше или равно 0. Обратите внимание, что вы можете передать только одно число. & Nbsp;

Но что означает & ldquo; математика & rdquo; часть синтаксиса выше относится к? Математический модуль - это библиотека Python, которая содержит множество полезных математических функций, одна из которых - функция sqrt () . Чтобы использовать sqrt () , вам нужно будет импортировать математический модуль, поскольку именно в нем хранится код для выполнения функции. С помощью префикса & ldquo; math & rdquo; в sqrt () компилятор знает, что вы используете функцию sqrt () , принадлежащую к & ldquo; math & rdquo; библиотека.

81% участников заявили, что они почувствовали себя более уверенными в своих перспективах трудоустройства в сфере высоких технологий после посещения учебного лагеря. Пройдите курс обучения сегодня.

Средний выпускник учебного лагеря потратил менее шести месяцев на смену карьеры, от начала учебного лагеря до поиска своей первой работы.

Способ импорта математики модуль должен написать ключевое слово & ldquo; import & rdquo; вместе с названием модуля & mdash; & ldquo; математика & rdquo; в этом случае. Оператор импорта - это простая строка, которую вы пишете перед кодом, содержащим функцию sqrt () :

Результатом функции извлечения квадратного корня является число с плавающей запятой (float). Например, результатом использования sqrt () для 81 будет 9.0, что является числом с плавающей запятой. & Nbsp;

Включите математический оператор импорта в начало любого файла или сеанса терминала / консоли, который содержит код, который использует sqrt () .

Как использовать метод sqrt () в Python

Вы можете передать положительное значение с плавающей запятой или int ( целое число) введите положительные числа. В предыдущем примере мы видели int, 81, как параметр. Но мы также можем передать числа с плавающей запятой, 70,5, например:

Результат этого вычисления: 8.916277250063503. Как видите, результат довольно точный. Теперь вы можете понять, почему имеет смысл выводить всегда двойное число, даже если квадратный корень из числа такой же простой, как & ldquo; 9 & rdquo ;.

Вы также можете передать переменная, представляющая число:

Работа с отрицательными числами с помощью abs ()

abs ( ) возвращает абсолютное значение заданного числа. Абсолютное значение -9 будет 9. Аналогично, абсолютное значение 9 равно 9. Поскольку sqrt () разработан для работы с положительными числами, отрицательное число вызовет исключение ValueError.

Предположим, вы передаете переменные в sqrt () и не можете узнать, все ли они положительны, без проверки длинных строк кода, чтобы найти значения переменных. В то же время вы также не хотите, чтобы на вас выдавалось исключение ValueError. Даже если вы посмотрите, может войти другой программист и непреднамеренно добавить отрицательную переменную, тогда ваш код выдаст ошибку. Чтобы предотвратить это безумие, вы можете использовать abs () :

Функция abs () примет ваше значение и переведет до абсолютного значения (в данном случае 81). Затем неотрицательное, абсолютное значение будет передано в функцию sqrt () , что нам и нужно, чтобы не получить надоедливых ошибок!

Составление списков и sqrt ()

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

Сначала составьте список значений, квадратные корни которых вы хотите получить.

Во-вторых, давайте переберем список с помощью выражения для цикла, чтобы получить квадрат корень для каждого значения. Синтаксис встроенного выражения цикла for - это число в числах, где & ldquo; число & rdquo; - это каждый член списка, который мы назвали & ldquo; числами & rdquo ;. Мы w я сохраню результаты в списке, который мы назовем & ldquo; squaredNumbers & rdquo ;.

Используйте оператор print () , чтобы увидеть результаты возведения списка чисел в квадрат. & nbsp;

for-Statements и sqrt ()

Вы также можете использовать типичный цикл for. Хотя использование типичного цикла for означает, что вам нужно написать больше строк кода, чем в приведенном выше примере, некоторые люди могут легче читать циклы for. & Nbsp;

«Карьерная карма вошла в мою когда мне это было нужно больше всего, и быстро помог мне устроиться в учебный лагерь. Через два месяца после выпуска я нашел работу своей мечты, которая соответствовала моим ценностям и целям в жизни! "

Венера, инженер-программист Rockbot

Сначала объявите список, в котором вы хотите сохранить вычисленные значения.

Мы будем использовать тот же список значений (& ldquo; numbers & rdquo;), что и в предыдущем примере, и перебираем каждый из его элементов. , который мы назвали & ldquo; number & rdquo ;.

Теперь, если вы распечатаете этот новый список чисел в квадрате, вы получите sam e выводите, как в предыдущем примере.

Пример с sqrt (): Диагональные расстояния

Для sqrt ) . Одним из примеров является то, что вы можете использовать его, чтобы найти диагональное расстояние между двумя точками, которые пересекаются под прямым углом, например, углы улиц или точки на поле или схеме чертежа.

Это связано с тем, что диагональное расстояние между двумя точками, пересекающимися под прямым углом, было бы эквивалентно гипотенузе треугольника, и для этого вы можете использовать теорему Пифагора (a 2 + b 2 ) = c 2 , который использует квадратные корни. Эта формула очень удобна, потому что на городских улицах, чертежах домов и полях , можно легко получить измерения длины и ширины, но не для диагоналей между ними.

Вам придется использовать sqrt () для гипотенузы, c 2 , чтобы иметь длину. Другой способ переписать теорему Пифагора - c = & radic; a 2 + b 2 . Давайте представим мы проехали круговую трассу в нашем местном парке в форме треугольника.

Мы пробежали по длине и ширине, а затем вернулись к исходной точке. Подсчитав, сколько футов вы пробежали, вы можете рассчитать футы диагонального пути, который вы пересекаете, используя длину и ширину (чью длину в футах вы можете сохранить как переменные & ldquo; a & rdquo; и & ldquo; b & rdquo;) парка:

Результатом будет 47.43416490252569. Итак, когда вы добавляете это к двум другим длинам, вы знаете, и вот оно, у вас есть. Общее количество футов, которое вы пробежали по дорожке в форме прямоугольного треугольника в парке.

Что еще вы можете сделать с помощью Sqrt ()?

Теперь, когда вы знаете основы, возможности безграничны. Например:

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

В этой статье вы узнали, как использовать sqrt () с положительными и отрицательными числами, списками и как переработать теорему Пифагора, чтобы что четыре математических вычисления выполняются с помощью sqrt () . & nbsp;

Читайте также: