Liczy pierwiastek kwadratowy przez uśrednianie x i S/x. Podwaja dokładność co krok.
Metoda babilońska (nazywana też metodą Herona) to bardzo szybki sposób na policzenie pierwiastka kwadratowego liczby – bez gotowej funkcji sqrt. Wystarczą cztery podstawowe działania.
Jak to działa? Chcemy policzyć √S. Zaczynamy od dowolnego dodatniego zgadnięcia x. Potem liczymy S / x i bierzemy średnią obu liczb: x = (x + S/x) / 2. To nowe x jest znacznie bliżej prawdziwego pierwiastka. Powtarzamy kilka razy i już.
Dlaczego to działa? Bo jeśli x jest za duże, to S/x wychodzi za małe – i odwrotnie. Prawdziwy pierwiastek leży zawsze między tymi dwiema liczbami. Ich średnia trafia więc bliżej celu niż każda z nich osobno.
Jak szybko? Wyjątkowo szybko – z każdym krokiem liczba dobrych cyfr mniej więcej się podwaja. Zwykle po 4–5 krokach mamy pierwiastek dokładny do wielu miejsc po przecinku.
Na maturze: typowe zadanie numeryczne – policzyć kilka kroków „na piechotę" albo napisać pętlę, która kończy się, gdy kolejne przybliżenia prawie się nie różnią.
Prześledź, jak x i S/x dociskają się do celu. Kreskowana linia to szukany √10. Zwróć uwagę, że jeden znacznik jest zawsze po lewej, a drugi po prawej – pierwiastek leży między nimi, a średnia wpada w środek.
Szukamy √10 (dokładnie ≈ 3,162…)
Naciśnij „Krok", aby uśrednić x i S/x, albo „Auto".
funkcja pierwiastek(S): jeżeli S = 0: zwróć 0 x ← S // dowolne dodatnie zgadnięcie dla i od 1 do 20: // 20 kroków wystarczy z dużym zapasem x ← (x + S / x) / 2 zwróć x
def pierwiastek(S, epsilon=1e-10):
"""Pierwiastek kwadratowy z S metodą babilońską (Herona)."""
if S == 0:
return 0
x = S # dowolne dodatnie zgadnięcie
while abs(x * x - S) > epsilon:
x = (x + S / x) / 2 # średnia z x i S/x
return x
# Przykład: pierwiastek z 10
print(round(pierwiastek(10), 6)) # Wynik: 3.162278#include <iostream>
#include <cmath>
using namespace std;
double pierwiastek(double S, double epsilon = 1e-10) {
if (S == 0) return 0;
double x = S; // dowolne dodatnie zgadniecie
while (fabs(x * x - S) > epsilon) {
x = (x + S / x) / 2; // srednia z x i S/x
}
return x;
}
int main() {
cout << pierwiastek(10) << "\n"; // Wynik: ok. 3.16228
}To po prostu średnia dwóch liczb: twojego zgadnięcia x i wyniku S/x. Jedna z nich jest za duża, druga za mała, więc ich środek jest lepszym przybliżeniem pierwiastka niż każda z osobna.
Od dowolnej dodatniej – metoda i tak szybko się zbiegnie. Popularny wybór to x = S albo x = S/2. Im lepsze pierwsze zgadnięcie, tym mniej kroków, ale różnica jest niewielka.
Bardzo mało. Liczba dobrych cyfr podwaja się z każdym krokiem, więc zwykle po 4–5 krokach masz pierwiastek dokładny do wielu miejsc po przecinku.
Dla zera wynik to zero – trzeba to obsłużyć osobno, żeby nie dzielić przez zero. Liczby ujemne nie mają pierwiastka rzeczywistego, więc tej metody się do nich nie stosuje.
Policzmy √10 metodą babilońską, zaczynając od x = 5. Każdy krok liczymy wzorem x = (x + 10/x) / 2. Wpisz odpowiedzi i kliknij Sprawdź.
Na starcie x = 5, więc `10 / 5 = , a nowe x to średnia liczb 5 i 2`, czyli .
Prawdziwy pierwiastek √10 leży zawsze między x a 10/x. Na starcie było to między 2 a .
Uzupełnij kolejne przybliżenia (zaokrąglij do 3 miejsc po przecinku):
| Krok | x |
|---|---|
| start | 5 |
| po 1. kroku | |
| po 2. kroku |
O(log log(1/ε))O(1)Czasowa O(log log(1/ε)). Brzmi groźnie, a znaczy tyle, że kroków potrzeba bardzo mało: skoro dokładność podwaja się z każdym krokiem, to do niemal dowolnej precyzji wystarczy kilka–kilkanaście iteracji, niezależnie od wielkości S. Pamięć O(1) – trzymamy tylko jedną liczbę x.
Do tego hasła nie mamy jeszcze przypisanych pojedynczych zadań. Cały spis zadań maturalnych z tego działu jest tutaj:
Zagadnienia z tego samego obszaru matury – warto je powtórzyć razem: