Záhada chýbajúceho štvorca

Nasledujúci problém by mal byť čitateľom intímne známy.

Práve prechádzam Knuthovu Concrete Mathematics, kde som zistil, že vyššie uvedený trik má aj zaujímavé pozadie. To pozadie tvoria Fibbonaciho čísla.

Tieto sú dané rekurziou

F_n = F_{n-1}+F_{n-2}

F_0 = 0, F_1=1

Takto získame postupnosť čísel 0,1,1,2,3,5,8,13,21,34,55,89,144… S Fibonacciho číslami možno zažiť kopec srandy a dopracovať sa k zaujímavým výsledkom. Nás zaujíma Cassiniho rovnosť:

F_{n+1}  F_{n-1}= F_n^2 +(-1)^n

ktorú možno dokázať pomocou indukcie. Túto rovnosť možno interpretovať nasledovne. Ak máme štvorec s obsahom F_n \times F_n  štvorčekov tak k nemu existuje obdĺžnik s rozmermi F_{n+1} \times F_{n-1}, ktorého obsah je o jeden štvorček menší/väčší, v závislosti od toho či je n párne alebo nepárne. Ľavý štvorec môžeme rozdeliť na dva štvoruholníky a dva trojuholníky, ktorých body majú vzdialenosť k hrane štvorca F_{n+1},F_{n}, F_{n-1} alebo F_{n-2}. Na prvý pohľad to vyzerá tak, že rovnako môžeme rozdeliť aj pravý štvorec.

Zdanie však klame. Všetky časti vpravo sú štvoruholníky (inak dĺžka čiar nesedí). Ak zvolíme tenšiu čiaru alebo menšie Fibonacciho číslo tak časti z ľavého štvorca do ľavého obdĺžnika nenapcháme.


Podobne funguje aj záhada chýbajúceho štvorca. Ak zmeriame rozmery trojuholníkov a ich častí, aj tu nájdeme zopár Fibonacciho čísiel. Problém však nemožno zovšeobecniť a vytvoriť ďalšie príklady pre vyššie Fibonacciho čísla. Ak je dlhšia vertikálna strana zelenej časti a, kratšia je b a dlhšiu a kratšiu stranu žltej časti označíme c a d. Tak vpravo musí platiť a=c a vľavo a+b=c+d a teda b=d. Zároveň však chceme aby b+d=a=c a  aby buď b alebo d bolo rovné 1 a teda musí platiť b=d=1 a c=a=2. Jediné riešenie, ktoré spĺňa podmienky je na začiatku uvedený problém.

Pripájam ešte program pre Python, ktorý vám umožní vygenerovať štvorce a obdĺžniky.

import numpy as np
import pylab as plt

def fibo(n): return int(((1 + 5**0.5)/2)**n/5**0.5+0.5)
s=4;e=9
for N in range(s,e):
    f0=fibo(N-2)
    f1=fibo(N-1)
    f2=fibo(N)
    f3=fibo(N+1)
    lw=2
    plt.figure(0)
    plt.subplot(e-s,2,(N-s)*2+1)
    plt.xlim([0,f2])
    plt.ylim([0,f2])
    ax=plt.gca()
    ax.set_xticks(range(f2))
    ax.set_xticklabels([])
    ax.set_yticks(range(f2))
    ax.set_yticklabels([])
    ax.set_aspect(1)
    plt.grid(linestyle='-')

    plt.plot([0,f1],[f1,f0],'k',lw=lw)
    plt.plot([f1,f1],[0,f2],'k',lw=lw)
    plt.plot([f1,f2],[0,f2],'k',lw=lw)

    plt.subplot(e-s,2,(N-s+1)*2)
    plt.xlim([0,f3])
    plt.ylim([0,f1])
    ax=plt.gca()
    ax.set_xticks(range(f3))
    ax.set_xticklabels([])
    ax.set_yticks(range(f1))
    ax.set_yticklabels([])
    ax.set_aspect(1)
    plt.grid(linestyle='-')

    plt.plot([0,f3],[f1,0],'k',lw=lw)
    plt.plot([f1,f1],[0,f0],'k',lw=lw)
    plt.plot([f2,f2],[f1,f1-f0],'k',lw=lw)
plt.show()