Математика та фрактали
Квітень 2026 · 15 хв читання · Теорія чисел · Процедурна генерація · Canvas 2D

Золотий перетин і Фібоначчі: філотаксис, ланцюгові дроби та оптимальні спіралі

Золотий перетин φ ≈ 1,618 трапляється всюди — у математиці, природі та образотворчому мистецтві — не через містичні властивості, а тому що це найірраціональніше число, а саме ірраціональність виявляється саме тим, що потрібно рослинам для максимального ущільнення насіння. Ця стаття пояснює глибокі звʼязки між числами Фібоначчі, ланцюговими дробами, філотаксисом і логарифмічними спіралями — а також будує інтерактивний генератор насіння соняшника.

1. Послідовність Фібоначчі

Послідовність Фібоначчі задається лінійним рекурентним співвідношенням:

F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, ...

Леонардо Пізанський («Фібоначчі») увів цю послідовність у 1202 році через задачу про розмноження кроликів, але вона трапляється в санскритській просодії (Віраханка, бл. 700 р. н. е.) та в комбінаторному аналізі Пінгали (бл. 200 р. до н. е.) більш ніж на тисячоліття раніше. Захід наново відкрив закономірність, яку природа використовувала сотні мільйонів років.

Темп зростання

Відношення сусідніх членів збігається до φ:

F(n+1) / F(n) → φ as n → ∞ Convergents: 1/1, 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, 34/21, ...

Підхідні дроби почергово лежать вище й нижче φ, з кожним кроком наближаючись усе ближче. Похибка обмежена:

|F(n+1)/F(n) − φ| < 1 / (F(n) · F(n+1)) ≈ φ^(−2n)

Ця експоненційна збіжність — і конкретна формула похибки — випливають безпосередньо з теорії ланцюгових дробів, яку розгорнуто в наступному розділі.

Тотожності

Тотожність Кассіні має красивий геометричний доказ через розрізання прямокутника Фібоначчі: відрізаємо квадрат від прямокутника (n+1)×n, лишаючи прямокутник n×(n−1). Тотожність вимірює невідповідність площ у вигляді визначника 2×2, а почергова зміна знаку (−1)ⁿ відповідає спіралі зі змінною хіральністю, побудованій у такий спосіб.

2. Золотий перетин: алгебраїчне означення

Золотий перетин φ означується як додатний корінь рівняння:

φ² = φ + 1 → φ = (1 + √5) / 2 ≈ 1.6180339887...

Це рівняння стверджує, що прямокутник зі сторонами φ та 1 лишається «золотим» (з тим самим співвідношенням сторін) після видалення одиничного квадрата — це визначальна властивість самоподібності. Спряжений корінь — це ψ = (1 − √5)/2 ≈ −0,618, який також задовольняє ψ² = ψ + 1.

Корисні алгебраїчні тотожності, що випливають із φ² = φ + 1:

1/φ = φ − 1 ≈ 0.618... φ² = φ + 1 ≈ 2.618... φ³ = 2φ + 1 ≈ 4.236... φⁿ = F(n)·φ + F(n-1) (in general)

Середнє геометричне / поділ у відношенні

Поділ відрізка довжиною 1 + φ на частини довжиною φ та 1 дає:

(1 + φ) / φ = φ / 1 = φ

Це «поділ у крайньому та середньому відношенні», відомий ще Евкліду: ціле відноситься до більшої частини так само, як більша частина — до меншої. Це самопосилальне означення є ключем до появи φ всюди, де відбувається самоподібне зростання.

3. Ланцюгові дроби та найірраціональніше число

Будь-яке дійсне число можна подати у вигляді ланцюгового дробу:

x = a₀ + 1/(a₁ + 1/(a₂ + 1/(a₃ + ...))) = [a₀; a₁, a₂, a₃, ...]

Раціональні числа мають скінченні ланцюгові дроби. Ірраціональні — нескінченні. Підхідні дроби (усічені наближення) є найкращими раціональними наближеннями до x зі знаменником ≤ qₙ.

Золотий перетин має найпростіший із можливих ланцюговий дріб:

φ = [1; 1, 1, 1, 1, ...] = 1 + 1/(1 + 1/(1 + 1/(1 + ...)))

Це випливає безпосередньо з φ = 1 + 1/φ. Оскільки всі неповні частки дорівнюють 1 (найменше можливе ціле число > 0), підхідні дроби F(n+1)/F(n) поліпшуються якомога повільніше — φ є дійсним числом, яке найважче наблизити раціональними. Це і є формальне значення вислову «найірраціональніше».

Теорема Гурвіца та межа наближення

Теорема Гурвіца стверджує, що для будь-якого ірраціонального x існує нескінченно багато раціональних дробів p/q, для яких:

|x − p/q| < 1 / (√5 · q²)

Константа √5 є точною — її не можна замінити на більшу так, щоб нерівність усе ще виконувалася для всіх ірраціональних чисел. Єдине число, для якого √5 є точно найкращою константою, — це φ (та повʼязані з ним еквіваленти). Будь-яке інше ірраціональне число можна наблизити з кращою константою. Саме тому φ — найгірший випадок для раціонального наближення, і саме тому поворот на 1/φ оберту є ідеальним кутом для розподілу зростання на спіралі — жодні раціональні субгармоніки не можуть сконцентрувати щільність.

4. Формула Біне та швидке обчислення Фібоначчі

Замкнений вираз для F(n) (Біне, 1843, хоча був відомий Ейлеру та де Муавру раніше):

F(n) = (φⁿ − ψⁿ) / √5 де φ = (1+√5)/2 і ψ = (1−√5)/2 ≈ −0,618

Оскільки |ψ| < 1, ψⁿ → 0, і F(n) — це просто найближче ціле до φⁿ/√5:

F(n) = round(φⁿ / √5) для всіх n ≥ 0

Це дозволяє пряме обчислення за O(1) — але лише в точній арифметиці. У подвійній точності IEEE 754 трюк із округленням ламається близько n ≈ 75 (коли F(75) ≈ 2,1 × 10¹⁵ перевищує 53-бітну мантису). Для великих n метод піднесення матриці до степеня є точним:

[ F(n+1) ] [ 1 1 ]^n [ F(1) ] [ F(n) ] = [ 1 0 ] · [ F(0) ] // Піднесення матриці до степеня через зведення в квадрат: O(log n) множень

Швидке обчислення Фібоначчі на JavaScript (BigInt)

// Швидке обчислення Фібоначчі через тотожність подвоєння (O(log n), точні цілі)
// F(2n)   = F(n) * (2*F(n+1) - F(n))
// F(2n+1) = F(n)^2 + F(n+1)^2
function fibBig(n) {
  if (n == 0n) return [0n, 1n];           // повертає [F(n), F(n+1)]
  const [a, b] = fibBig(n >> 1n);
  const c = a * (2n * b - a);
  const d = a * a + b * b;
  return (n & 1n) === 0n ? [c, d] : [d, c + d];
}

// Використання:
const [f100, _] = fibBig(100n);
console.log(f100.toString());  // 354224848179261915075 (точно)
    

5. Філотаксис: чому рослини рахують числами Фібоначчі

Філотаксис — це вивчення розташування листків, насінин і пелюсток на рослині. У суцвітті соняшника насіння розташоване у вигляді переплетених спіралей. Підрахунок спіралей за годинниковою стрілкою та проти неї незмінно дає сусідні числа Фібоначчі — зазвичай 34 і 55 або 55 і 89 для великих суцвіть.

Чому? Кожен новий зачаток насінини зʼявляється на верхівці зростаючої меристеми й розташовується під певним кутом до попереднього, що визначається кутом розходження. Оптимальний кут — який максимізує мінімальну відстань між будь-якими двома насінинами для всіх n — виявляється золотим кутом:

золотий кут = 2π · (1 − 1/φ) = 2π · (2 − φ) ≈ 137,508° = 360° / φ² ≈ 137,508°

Це не біологічне припущення: це наслідок теореми Гурвіца. Будь-який раціональний дріб p/q як кут розходження збив би насіння в q прямих ліній (симетрія q-го порядку). Найірраціональніший кут (1/φ повного оберту) уникає всіх раціональних резонансів і дає найрівномірніше заповнення.

Гіпотеза Гофмейстера

Найпростіший механізм, що породжує золотий кут, — це правило Гофмейстера (1868): кожен новий зачаток утворюється в найбільшій вільній прогалині в поточній конфігурації. Компʼютерні симуляції (Дуаді та Кудер, 1992) показують, що це правило, застосоване ітеративно до диска з елементами, що радіально розширюються, спонтанно породжує візерунок спіралі Фібоначчі без жодного попереднього програмування чисел Фібоначчі — послідовність виникає з фізики пакування.

Спіралі Фібоначчі в природі

Спростування міфу: Коефіцієнт зростання мушлі наутилуса становить приблизно 1,33 на чверть оберту, а не φ ≈ 1,618. «Золота спіраль», накладена на фото наутилуса, просто не збігається — спіралі різні. Справжні золоті спіралі трапляються у філотаксисі, де математика їх неухильно вимагає; наутилус — це випадковий збіг естетичних ярликів.

6. Золотий кут і генератор соняшника

Канонічне розташування насіння соняшника: насінина n розміщується під кутом n × 137,508° і на радіусі, пропорційному √n (однакова площа на насінину):

θₙ = n · 2π / φ² (радіани) rₙ = c · √n (c = коефіцієнт масштабу) x = rₙ · cos(θₙ) y = rₙ · sin(θₙ)
// Філотаксис соняшника — Canvas 2D
function drawSunflower(canvas, N = 1000) {
  const ctx   = canvas.getContext('2d');
  const cx    = canvas.width  / 2;
  const cy    = canvas.height / 2;
  const c     = canvas.width  / (2.2 * Math.sqrt(N));
  const PHI   = (1 + Math.sqrt(5)) / 2;
  const angle = 2 * Math.PI / (PHI * PHI);   // золотий кут ≈ 2.399 рад

  ctx.fillStyle = '#0a0a14';
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  for (let n = 0; n < N; n++) {
    const theta = n * angle;
    const r     = c * Math.sqrt(n);
    const x     = cx + r * Math.cos(theta);
    const y     = cy + r * Math.sin(theta);

    // Колір залежно від частки кута для візуального проявлення спіралі
    const hue = (n / N * 360 + 200) % 360;
    ctx.beginPath();
    ctx.arc(x, y, Math.max(1, c * 0.45), 0, Math.PI * 2);
    ctx.fillStyle = `hsl(${hue}, 75%, 60%)`;
    ctx.fill();
  }
}
    

Вплив кута розходження

Зміна кута від 137,508° показує, чому він оптимальний:

Ця чутливість ілюструє екстремальну властивість: золотий кут — це вузький оптимум, і тиск біологічного добору надійно знаходив його протягом сотень мільйонів років еволюції рослин.

7. Логарифмічні спіралі та самоподібність

Логарифмічна спіраль (також: рівнокутна спіраль) має таке рівняння в полярних координатах:

r = a · e^(b·θ) // У декартовій формі: x(t) = a · e^(b·t) · cos(t) y(t) = a · e^(b·t) · sin(t)

Її визначальна властивість: кут між дотичною в будь-якій точці та радіальною лінією є сталим (властивість «рівнокутності»). Цей кут α задовольняє tan(α) = 1/b.

Золота спіраль

Золота спіраль зростає у φ разів на чверть оберту (90°). Вона виникає з розрізання прямокутника Фібоначчі: кожен прямокутник можна розбити на квадрат і менший золотий прямокутник, а дуга чверті кола в кожному квадраті наближує спіраль. Точна спіраль має:

b = (2/π) · ln(φ) ≈ 0,3063 (темп зростання на радіан) α = arctan(π / (2·ln(φ))) ≈ 72,97° (властивість рівнокутності)

Кожен повний оберт множить радіус на e^(2πb) = φ⁴ ≈ 6,854. Пів оберту множить його на φ² ≈ 2,618. Чверть оберту множить його на φ ≈ 1,618 — звідси й «золота».

Самоподібність

Логарифмічна спіраль — єдина плоска крива, самоподібна щодо повороту. Поворот на кут θ₀ ідентичний масштабуванню на e^(b·θ₀). Це означає, що наближення до логарифмічної спіралі в початку координат із одночасним поворотом дає нерухоме зображення — властивість, яку використовують у компʼютерній графіці для фрактальних анімацій із нескінченним масштабуванням.

Самоподібність золотої спіралі за повороту на 90° (масштабування на φ на чверть оберту) — це причина, чому працює розрізання прямокутника Фібоначчі: кожен вкладений квадрат додає чверть оберту спіралі, а прямокутники замощуються ідеально, бо відношення сусідніх чисел Фібоначчі збігаються до φ.

8. Теорема Цекендорфа та кодування Фібоначчі

Теорема Цекендорфа

Кожне додатне ціле число має єдине подання у вигляді суми несусідніх чисел Фібоначчі (Цекендорф, 1972):

// Жадібний алгоритм: послідовно віднімати найбільше число Фібоначчі ≤ залишку 100 = 89 + 8 + 3 ( = F(11) + F(6) + F(4) ) 42 = 34 + 8 ( = F(9) + F(6) ) 19 = 13 + 5 + 1 ( = F(7) + F(5) + F(2) )

Доказ єдиності спирається на тотожність Фібоначчі F(n) = F(n−1) + F(n−2): якщо в поданні зʼявляються два сусідні числа F, їх завжди можна обʼєднати в наступне F — тож будь-яке подання із сусідніми членами можна спростити до подання без них. Існування доводиться індукцією за допомогою жадібного алгоритму.

Кодування Фібоначчі (стиснення даних)

Подання Цекендорфа дають змогу побудувати універсальний код для цілих чисел:

// Кодуємо n: записуємо його подання Цекендорфа як бітовий рядок // молодший біт = біт F(2), старший біт = найбільше використане число Фібоначчі, додаємо термінатор '1' 1 → 1 1 (F(2)=1, плюс термінатор) 2 → 01 1 (F(3)=2, плюс термінатор) 4 → 101 1 (F(4)=3? Ні: 4 = F(5)+F(2) = 3+1, тож біти = 1001, термінатор = 10011)

Кодування Фібоначчі має властивість бути самосинхронізованим кодом: будь-яка поява «11» у бітовому потоці позначає або межу кодового слова, або послідовність термінатора. Після одиничної бітової помилки декодер пересинхронізується на наступній появі «11» — це властивість стійкості до помилок, якої немає в кодуванні Гаффмана чи арифметичному кодуванні. Це робить коди Фібоначчі корисними для стиснення індексів баз даних (використовується в деяких версіях стиснення TOAST у PostgreSQL) та заголовках мережевих протоколів, де важлива синхронізація потоку.

Пошук Фібоначчі

Алгоритм пошуку Фібоначчі — це альтернатива бінарному пошуку, яка використовує числа Фібоначчі для поділу масиву, уникаючи ділення й краще працюючи на носіях із нерівномірною вартістю доступу (наприклад, магнітна стрічка, деякі компонування SSD):

// Пошук Фібоначчі (відсортований масив arr, шукане значення)
function fibSearch(arr, target) {
  const n = arr.length;
  let fibM2 = 0, fibM1 = 1, fib = 1;        // F(k-2), F(k-1), F(k)
  while (fib < n) { fibM2 = fibM1; fibM1 = fib; fib = fibM1 + fibM2; }

  let offset = -1;
  while (fib > 1) {
    const i = Math.min(offset + fibM2, n - 1);
    if (arr[i] < target)      { fib = fibM1; fibM1 = fibM2; fibM2 = fib - fibM1; offset = i; }
    else if (arr[i] > target) { fib = fibM2; fibM1 -= fibM2; fibM2 = fib - fibM1; }
    else return i;
  }
  if (fibM1 && arr[offset + 1] === target) return offset + 1;
  return -1;
}
    
Загальна картина: Звʼязки в цій статті — теорема Гурвіца → золотий кут → спіралі Фібоначчі → кодування Цекендорфа — не випадкові. Усі вони сягають єдиного факту: φ — найпростіший ланцюговий дріб [1;1,1,1,...]. Математика оптимального пакування, теорія чисел і стиснення даних мають спільний корінь в ірраціональності φ.