Ще про PI

Сьогодні — день числа π, прийнамні дехто його відзначає саме сьогодні, 14 березня, тобто 3.14. Тому я пропоную вам здогадатися, що робить така функція на javascript:
function f (eps) {
  var ci, cj, zi, zj, n, abs
  ci = -0.75; cj = eps; zi = ci;  zj = cj
  n = 0; abs = 0
  while (abs < 2) {
    zi2 = zi*zi; zj2 = zj*zj; abs = Math.sqrt(zi2 + zj2);
    zj = 2*zi*zj + cj;
    zi = zi2 - zj2 + ci;
    n += 1
  }
  return n*eps;
}


Спробуємо розібратися. Назви змінних zi, ci тощо наводять на думку, що це щось із математики. Придивившись, бачимо, що zi2 — це просто zi2, а zj2zj2. І бачимо, що abs — це модуль комплексного числа (zi,zj). Неважко здогадатися, що ci, cj теж використовуються як компоненти комплексного числа. Озброєні цими знаннями, можемо переписати функцію на псевдокоді таким чином:
C = (-0.75, eps); Z = C; n=0;
while (abs(Z) < 2) {
   Z = Z^2 + C;
   n++;
}
Хто знайомий з фракталами, може пригадати, що це класична функція для малювання найвідомішого з фракталів, схожої на серце множини Мандельброта. Колір точки визначається кількістю ітерацій, необхідних для того, щоб абсолютна величина числа Z перевисила 2. Отже, перед нами функція, що визначає колір точки множини Мандельброта з координатами (-0,75;eps). Чому -0,75? Якщо подивитися на графічне зображення множини Мандельброта, то видно, що у точці з дійсною компонентою -0,75 множина "звужується" в напрямку уявної осі.

Все? Ні, не все. Спробуйте тепер виконати цю функцію, задаючи eps (очевидно, епсилон) малим. Спробуйте eps=0.1, 0.001, 0.000001. Як не дивовижно, але функція обраховує число π с заданою точністю! Число ітерацій зворотньо пропорційно eps. Отже, число π таки всюдисутнє. Доведення цієї дивовижної формули, що зв'язує число π з множиною Мандельброта на комплексній площині, є досить нетривіальним, бажаючі можуть ознайомитись з ним тут.

додати коментар: