Насколько я знаю, вычисление, является ли число квадратом, на самом деле не быстрее, чем вычисление его квадратного корня в сложных случаях. Что действительно верно, так это то, что вы можете сделать предварительное вычисление, чтобы узнать, что это не квадрат, что может сэкономить ваше время в среднем.
Аналогично для этой проблемы вы можете выполнить предварительное вычисление, чтобы определить, что sqrt (b) -sqrt (a)> = 1, что означает, что a и b достаточно далеко друг от друга, и между ними должен быть квадрат. Для некоторой алгебры это неравенство эквивалентно условию, что (ba-1) ^ 2> = 4 * a, или, если вы хотите его в более симметричной форме, что (ab) ^ 2 + 1> = 2 * (a + б). Таким образом, это предварительное вычисление может быть выполнено без квадратных корней, только с одним целочисленным произведением и некоторыми сложениями и вычитаниями.
Если a и b практически одинаковы, то вы все равно можете использовать прием просмотра двоичных цифр низкого порядка в качестве предварительного вычисления, чтобы узнать, что между ними нет квадрата. Но они должны быть настолько близко друг к другу, чтобы это предварительное вычисление не стоило того.
Если эти предварительные вычисления неубедительны, то я не могу думать ни о чем другом, кроме решения всех остальных, a <= ceil (sqrt (a)) ^ 2 <b. </p>
Поскольку встал вопрос о правильной алгебре:
sqrt(b)-sqrt(a) >= 1
sqrt(b) >= 1+sqrt(a)
b >= 1+2*sqrt(a)+a
b-a-1 >= 2*sqrt(a)
(b-a-1)^2 >= 4*a
Кроме того: Обычно, когда a является большим числом, вы вычисляете sqrt (a) с помощью метода Ньютона или таблицы поиска, за которой следуют несколько шагов метода Ньютона. В принципе, быстрее вычислить ceil (sqrt (a)), чем sqrt (a), потому что арифметику с плавающей запятой можно упростить до целочисленной арифметики, а также потому, что вам не нужно столько шагов метода Ньютона, чтобы получить высокую точность, которая Вы просто собираетесь выбросить. Но на практике функция числовой библиотеки может быть намного быстрее, если она использует квадратные корни, реализованные в микрокоде. Если по какой-либо причине у вас нет этого микрокода, который мог бы вам помочь, то, возможно, стоит написать код ceil (sqrt (a)). Возможно, самый интересный случай будет, если a и b - неограниченные целые числа (например, тысяча цифр). Но для целых чисел обычного размера на обычном, не устаревшем компьютере вы не можете превзойти FPU.