Тема извлечения квадратного корня стара как этот мир, затертые до дыр подборы ближайших корней и следование различным закономерностям навели меня на мысль что тут явно что-то не так, любой путь начинается с первого шага, любое число с ноля, проще говоря меня не устраивал тот факт что в извлечении квадратного корня не было этой плавной шкалы сложности, ты просто внезапно оказываешься в пучине поисков ближайших подходящий корней с подстановкой, с поиском закономерностей и кучей различных подсказок вроде того что если число заканчивается на 5 и т.д. Мне захотелось создать такой метод, который был бы лишен всего этого, и давал точный результат, до дня рождения оставалось примерно 2 недели, именно за такой короткий промежуток времени мне и удалось воплотить сие решение. Итак, я не профессор математических познаний, поэтому язык моего изложения будет на уровне простой математики.
Данный метод извлечения основан на правиле эталонности четвертой части динамического делителя, который мы и будем вычислять,почему именно динамический? Потому что нам придется по мере продвижения к решению его корректировать. Давайте рассмотрим все шаги по этапно:
Получаем первоначальный динамический делитель.
Производим скроллинг и уточнение динамического делителя.
Проверяем точность динамического делителя (с возможной единичной корректировкой).
Получаем квадратный корень.
А теперь каждый шаг подробно на примере числа 97344.
1) Первоначальный делитель: 100
Правило первоначального делителя - десять в степени (количества пар в нашем числе, с вычетом одного нуля) или еще проще - количество пар в числе переводим в ноли и первый ноль заменяем на единицу.
2) Скроллинг и уточнение динамического делителя. (160.84)

Разделив наше число на начальный делитель мы получаем следующий результат:
97344 / 100 = 973.44 нам необходимо на этом шаге выяснить можем ли мы из текущего результата получить точный квадратный корень, для этого на основе нашего делителя мы создаем (Рамки допустимости вычисления) первым числом в которых будет начальное значение рамок, которое больше делителя в 2 раза, середина рамок будет числом больше делителя в 4 раза и конечные рамки будут числом больше делителя в 8 раз.
Наш результат деления мы подставляем к рамкам и смотрим находится ли он в этих рамках. С делителем 100 мы не можем работать, так как результат деления больше максимального значения рамок, поэтому мы скролим дальше, увеличивая наш делитель в 2 раза и повторяя все проделанные шаги еще раз. На втором шаге, с делителем 200 мы можем работать, так как результат деления оказывается в вычисленных рамках (Рамках допустимости вычисления).
На этом наш скроллинг завершен и теперь нам надо уточнить наш динамический делитель.

Выражение, уточняющее наш динамический делитель выглядит следующим образом
200 - ((800 - 486.72) / 8) = 160.84 Давайте рассмотрим все по подробнее, первое в выражении число наш текущий делитель, вторым стоит минус потому что если смотреть в скрин на (Рамки вычитания или добавления) наш результат деления ( 486.72 ) находится ниже середины. Далее в рамках мы получаем разность чисел результата деления и середины рамок, которую делим на 8, результатом и будет наш обновленный динамический делитель, точность которого необходимо проверить.

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

На основе вычисления на предыдущем шаге, так как корректировка нам оказалась не нужна, берем результат, делим его на четыре далее прибавляем к результату наш делитель и отбрасываем дробную часть. Результатом будет точный квадратный корень.
Небольшой лайфхак для тех кто решит письменно проверить данный метод, на стадии скроллинга результат продолжайте делить на 2, каждое следующее деление на 2 будет удваивать наш делитель, приведу пример:
8271376 / 1000 = 8271.376 (фактический делитель 1000)
8271.376 / 2 = 4135.688 (фактический делитель 2000)
4135.688 / 2 = 2067.844 (фактический делитель 4000)
Всем удачи.
Комментарии (11)
bfDeveloper
22.05.2025 12:30Какая сходимость метода? То есть сколько итераций корректировок нужно для достижения заданной точности? Что-то мне подсказывает, что даже метод Герона менее вычислительно затратен
wataru
22.05.2025 12:30Чем метод ньютона не подходит? Берем какой-то x и вычисляем несколько раз (N/x+x)/2.
Вот начнем с x=100 для N=97344
(100+97344/100)/2 = 536,72
(536,72+97344/536,72)/2 = 359,04
(359,04+97344/359,04)/2 = 315,08
(315,08+97344/315,08)/2=312,015
Всего 4 итерации и очень простое правило. У вас какие-то похожие этапы есть с делением N на "делитель".
А про ваш метод надо сначала доказать вообще, что он работает. Формулы записать в общем виде хотя бы, а не не в виде пары скриншотов с конкретным числом. Без этих всяких напридумыванных терминов. Что вообще за бессмысленный суп из слов "эталонность четвертой части динамического делителя".
Отдельный минус в карму за наглость называния этого по своей фамилии. Это звенящая пошлость. Особенно после " я не профессор математических познаний". Фамилию к вашему методу может быть представят потомки, если он чем-то выдающийся окажется.
sair Автор
22.05.2025 12:30Данный метод проверялся автоматически через скрипт js от 2-x до 10-значных чисел, все результаты верны. По поводу максимально возможной итерации, во всей проверке не было больше 5 итераций. Большое спасибо за критику по поводу того, что не ввел понятие формулы, после упрощения,рефакторинга и дай бог доведения этого метода до двух шагов, обязательно представлю формулу, сейчас он чересчур громоздкий и по этой причине разложен пошагово, на данном этапе его стоит рассматривать от части лишь как общий эскиз, который отражает в себе основную идею, на базе которой и будут происходить все последующие итерации оптимизаций и упрощений. Еще раз спасибо за проявленное горячее внимание, а то что Вас зацепила моя фамилия в наименовании метода... нету законов которые регламентировали бы это, надеюсь Вам это не испортило настроение, желаю Вам как можно больше позитивного восприятия всего что смогло дотянутся до вашего взора в этой временной точке.
wataru
22.05.2025 12:30Данный метод проверялся автоматически через скрипт js от 2-x до 10-значных чисел
Это не гарантия истинности. Хорошо бы формулы с доказательствами сходимости получить. Так-то, есть в математике закономерности, которые внезапно ломаются только на очень больших числах. Вот тут второй пример прикольный - очень похожие интегралы и дают ровно пи/2, пока туда не вставишь 42-значное число: https://www.youtube.com/watch?v=n4VWgquP8D0
Так что проверка на компьютере - первый необходимый шаг, но совсем не достаточный.
сейчас он чересчур громоздкий
У вас там кроме деления N на x, умножения на 2 ничего и нету практически. Не особо громоздко. Правда, если его таки записать формально. может получится тот же самый метод Ньютона, только вид сбоку.
нету законов которые регламентировали бы это
Нету законов, есть правила приличия.
DimPal
22.05.2025 12:30Вспоминается 0x5f3759df. Велосипед изобретён заново, но отличий от классического подхода не вижу. Выбор начального значения причудлив, бинарный поиск ближайшей сепени двойки IMHO будет быстрее. А дальше у вас применяется обычный метод Герона.
mark_ablov
22.05.2025 12:30Для больших (тысячи разрядов) чисел алгоритм а-ля "разделяй и властвуй" быстрее.
sair Автор
22.05.2025 12:30Ребята я его сейчас оптимизирую до двух шагов, обязательно выложу статью. Спасибо за комментарии.
SheldonP
22.05.2025 12:30"Правило первоначального делителя - десять в степени (количества пар в нашем числе, с вычетом одного нуля)..."
Поясните процитированное правило: в примере пятизначное число 97344 из которого можно составить 10 пар ( 97, 93, 94, 94, 73, 74, 74 и т.д.). Что я не понял?
sair Автор
22.05.2025 12:3097344 -> (9->0) (73->0) (44->0) = Десять в степени три = 1000 Отбрасываем один ноль = 100
pnmv
почему-то, вспомнил о методе градиентного спуска.