Obliczanie, czy liczba jest kwadratem, nie jest tak naprawdę szybsze niż obliczenie pierwiastka kwadratowego w trudnych przypadkach, o ile wiem. Prawdą jest to, że możesz dokonać precomputation, aby wiedzieć, że nie jest to kwadrat, który może zaoszczędzić czas średnio.
Podobnie w przypadku tego problemu, można wykonać obliczenia wstępne, aby określić, że sqrt (b) -sqrt (a)> = 1, co oznacza, że a i b są na tyle daleko od siebie, że między nimi musi być kwadrat. W przypadku pewnej algebry ta nierówność jest równoważna warunkowi, że (ba-1)^2> = 4 * a, lub jeśli chcesz go w bardziej symetrycznej formie, to (ab)^2 + 1> = 2 * (a + b). Zatem to obliczenie wstępne można wykonać bez pierwiastków kwadratowych, tylko z jednym produktem całkowitym i pewnymi dodatkami i odejmacjami.
Jeśli a i b są prawie dokładnie takie same, to nadal możesz wykorzystać sztuczkę szukania cyfr binarnych niskiego rzędu jako wstępnego obliczenia, aby wiedzieć, że między nimi nie ma kwadratu. Ale muszą być tak blisko siebie, że to wcześniejsze obliczenie może nie być tego warte.
Jeśli te wstępne obliczenia są niejednoznaczne, to nie mogę wymyślić niczego innego niż rozwiązanie innych osób, tj. < = ceil (sqrt (a))^2 < b.
Ponieważ nie była to kwestia robi prawo algebry:
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
także: Ogólnie, kiedy to duża liczba, by obliczyć sqrt (a) metodą Newtona lub z tabelą odnośników, po której następuje kilka kroków metody Newtona. Zasadniczo przyspieszenie obliczenia ceil (sqrt (a)) jest mniejsze niż sqrt (a), ponieważ arytmetyka zmiennoprzecinkowa może być uproszczona do arytmetycznej liczby całkowitej, a także dlatego, że nie potrzeba tylu kroków metody Newtona, aby uzyskać wysoką precyzję, po prostu wyrzucisz. Ale w praktyce funkcja biblioteki numerycznej może być znacznie szybsza, jeśli używa ona pierwiastków kwadratowych zaimplementowanych w mikrokodzie. Jeśli z jakiegoś powodu nie masz tego mikrokodu, który mógłby ci pomóc, to może warto go zaszyfrować (sqrt (a)). Być może najciekawszym przypadkiem byłoby, gdyby a i b były nieograniczonymi liczbami całkowitymi (np. Tysiąc cyfr). Ale w przypadku zwykłych liczb całkowitych na zwykłym, nieaktualnym komputerze, nie można pokonać jednostki FPU.
Twój trzeci przykład jest nieprawidłowy, jeśli <= n^2 duffymo
@ duffymo: ale część "n^2 Amadan
Wystarczająco fair, zgadzam się. – duffymo