web-dev-qa-db-fra.com

Un algorithme de Fibonacci inverse?

Il existe des dizaines de façons de calculer F(n) pour un n arbitraire, dont beaucoup ont une grande exécution et une grande utilisation de la mémoire.

Supposons cependant que je veuille poser la question inverse:

Étant donné F(n) pour n> 2, qu'est-ce que n?

(La restriction n> 2 est là puisque F(1) = F(2) = 1 et il n'y a pas d'inverse sans ambiguïté).

Quelle serait la façon la plus efficace de résoudre ce problème? Il est facile de le faire en temps linéaire en énumérant les nombres de Fibonacci et en s'arrêtant lorsque vous atteignez le nombre cible, mais existe-t-il un moyen de le faire plus rapidement que cela?

EDIT: actuellement, la meilleure solution publiée ici s'exécute en temps O (log n) en utilisant la mémoire O (log n), en supposant que les opérations mathématiques s'exécutent en O(1) = et qu'une machine Word peut contenir n'importe quel nombre dans O(1) espace. Je suis curieux de savoir s'il est possible de supprimer les besoins en mémoire, puisque vous pouvez calculer les nombres de Fibonacci en utilisant O(1) espace.

68
templatetypedef

Puisque OP a demandé une solution matricielle n'impliquant aucun calcul en virgule flottante, la voici. Nous pouvons atteindre O(logn) complexité de cette façon, en supposant que les opérations numériques ont O(1) complexité.

Prenons la matrice 2x2 A ayant la structure suivante

1 1
1 0

Considérons maintenant le vecteur (8, 5), Stockant deux nombres de fibonacci consécutifs. Si vous le multipliez par cette matrice, vous obtiendrez (8*1 + 5*1, 8*1 + 5*0) = (13, 8) - le prochain numéro de fibonacci.
Si nous généralisons, A^n * (1, 0) = (f(n), f(n - 1)).

L'algorithme réel prend deux étapes.

  1. Calculez A^2, A^4, A^8, Etc. jusqu'à ce que nous passions le nombre souhaité.
  2. Effectuez une recherche binaire par n, en utilisant les puissances calculées de A.

En passant, n'importe quelle séquence de la forme f(n) = k1*f(n-1) + k2*f(n-2) + k3*f(n-3) + .. + kt*f(n-t) peut être présentée comme ceci.

52
Nikita Rybak

Wikipedia donne le résultat comme

n(F) = Floor[ Log(F Sqrt(5) + 1/2)/Log(Phi)]

où Phi est le nombre d'or.

40
rcollyer

Si vous pouvez facilement interpréter F(n) en binaire,

formula

Vous pouvez vous méfier des constantes 1.7 et 1.1. Ceux-ci fonctionnent parce que d * 1.44042009041 + C n'est jamais très proche d'un entier.

Je peux publier une dérivation demain s'il y a un intérêt.

Voici un tableau avec n = 2 à 91, qui montre le résultat de la formule avant le revêtement de sol:

 n  formula w/o floor     F(n) F(n) in binary

 2  2.540                    1 1
 3  3.981                    2 10
 4  4.581                    3 11
 5  5.421                    5 101
 6  6.862                    8 1000
 7  7.462                   13 1101
 8  8.302                   21 10101
 9  9.743                   34 100010
10 10.343                   55 110111
11 11.183                   89 1011001
12 12.623                  144 10010000
13 13.223                  233 11101001
14 14.064                  377 101111001
15 15.504                  610 1001100010
16 16.104                  987 1111011011
17 17.545                 1597 11000111101
18 18.385                 2584 101000011000
19 19.825                 4181 1000001010101
20 20.425                 6765 1101001101101
21 21.266                10946 10101011000010
22 22.706                17711 100010100101111
23 23.306                28657 110111111110001
24 24.147                46368 1011010100100000
25 25.587                75025 10010010100010001
26 26.187               121393 11101101000110001
27 27.028               196418 101111111101000010
28 28.468               317811 1001101100101110011
29 29.068               514229 1111101100010110101
30 30.508               832040 11001011001000101000
31 31.349              1346269 101001000101011011101
32 32.789              2178309 1000010011110100000101
33 33.389              3524578 1101011100011111100010
34 34.230              5702887 10101110000010011100111
35 35.670              9227465 100011001100110011001001
36 36.270             14930352 111000111101000110110000
37 37.111             24157817 1011100001001111001111001
38 38.551             39088169 10010101000111000000101001
39 39.151             63245986 11110001010000111010100010
40 40.591            102334155 110000110010111111011001011
41 41.432            165580141 1001110111101000110101101101
42 42.032            267914296 1111111110000000110000111000
43 43.472            433494437 11001110101101001100110100101
44 44.313            701408733 101001110011101010010111011101
45 45.753           1134903170 1000011101001010011111110000010
46 46.353           1836311903 1101101011100111110010101011111
47 47.193           2971215073 10110001000110010010010011100001
48 48.634           4807526976 100011110100011010000101001000000
49 49.234           7778742049 111001111101001100010111100100001
50 50.074          12586269025 1011101110001100110011100101100001
51 51.515          20365011074 10010111101110110010110100010000010
52 52.115          32951280099 11110101100000011001010000111100011
53 53.555          53316291173 110001101001111001100000101001100101
54 54.396          86267571272 1010000010101111100101010110001001000
55 55.836         139583862445 10000001111111110110001011011010101101
56 56.436         225851433717 11010010010101110010110110001011110101
57 57.276         365435296162 101010100010101101001000001100110100010
58 58.717         591286729879 1000100110101011011011110111110010010111
59 59.317         956722026041 1101111011000001000100111001011000111001
60 60.157        1548008755920 10110100001101100100000110001001011010000
61 61.598        2504730781961 100100011100101101100101101010100100001001
62 62.198        4052739537881 111010111110011010000110011011101111011001
63 63.038        6557470319842 1011111011011000111101100000110010011100010
64 64.478       10610209857723 10011010011001100001110010100010000010111011
65 65.078       17167680177565 11111001110100101001011110101000010110011101
66 66.519       27777890035288 110010100001110001011010001001010011001011000
67 67.359       44945570212853 1010001110000010110100101111110010101111110101
68 68.800       72723460248141 10000100010010001000000000000111101001001001101
69 69.400      117669030460994 11010110000010011110100110000101111111001000010
70 70.240      190392490709135 101011010010100100110100110001101101000010001111
71 71.681      308061521170129 1000110000010111000101001100010011100111011010001
72 72.281      498454011879264 1110001010101011101011110010100001001111101100000
73 73.121      806515533049393 10110111011000010110000111110110100110111000110001
74 74.561     1304969544928657 100101000101101110011100110001010110000110110010001
75 75.161     2111485077978050 111100000000110001001101110000001010111101111000010
76 76.602     3416454622906707 1100001000110011111101010100001100001000100101010011
77 77.442     5527939700884757 10011101000111010000111000010001101100000010100010101
78 78.042     8944394323791464 11111110001101110000100010110011001101000111001101000
79 79.483    14472334024676221 110011011010101000001011011000100111001001001101111101
80 80.323    23416728348467685 1010011001100010110001111101111000000110010000111100101
81 81.764    37889062373143906 10000110100110111110011011000111100111111011010101100010
82 82.364    61305790721611591 11011001110011010100101010110110101000101101011101000111
83 83.204    99194853094755497 101100000011010010011000101111110010000101000110010101001
84 84.644   160500643816367088 1000111010001101100111110000110100111001010110001111110000
85 85.244   259695496911122585 1110011010100111111010110110110011001001111111000010011001
86 86.085   420196140727489673 10111010100110101100010100111101000000011010101010010001001
87 87.525   679891637638612258 100101101111011101011101011110011011001101010100010100100010
88 88.125  1100087778366101931 111101000100010011000000000110000011010000101001100110101011
89 89.566  1779979416004714189 1100010110011110000011101100100011110011101111101111011001101
90 90.406  2880067194370816120 10011111111000000011011101101010100001101110100111100001111000
91 91.846  4660046610375530309 100000010101011110011111011001111000000001100100101011101000101

"

12
Tom Sirgedas

Mesurer l'utilisation de la mémoire en comptant les mots non bornés est un peu idiot, mais tant que c'est le modèle, il y a un temps O (log n), O(1) = Solution Word similaire à celle de Nikita Rybak qui calcule essentiellement n via sa représentation Zeckendorf , qui est basée sur les nombres de Fibonacci (YO DAWG).

Définir la matrice

      1  1
A  =       ,
      1  0

qui satisfait

        F(m + 1)    F(m)
A^m  =                      .
          F(m)    F(m - 1)

Au lieu de la séquence A^(2^k), nous allons utiliser la séquence A^F(k). Cette dernière séquence a la propriété de pouvoir avancer avec une matrice multipliée

A^F(k + 1) = A^F(k - 1) * A^F(k)

et en arrière avec une matrice inverse et multiplication

A^F(k - 1) = A^F(k + 1) (A^F(k))^-1,

afin que nous puissions construire un itérateur bidirectionnel avec seulement huitsix douze mots en supposant que nous stockons tout comme des rationnels (pour éviter de supposer l'existence d'une division des coûts unitaires). Le reste est en train d'adapter cet algorithme d'espace O (1) pour trouver une représentation de Zeckendorf.

def zeck(n):
    a, b = (0, 1)
    while b < n:
        a, b = (b, a + b)
    yield a
    n1 = a
    while n1 < n:
        a, b = (b - a, a)
        if n1 + a <= n:
            yield a
            n1 += a
            a, b = (b - a, a)

>>> list(zeck(0))
[0]
>>> list(zeck(2))
[1, 1]
>>> list(zeck(12))
[8, 3, 1]
>>> list(zeck(750))
[610, 89, 34, 13, 3, 1]
11
user635541

Il a été prouvé que la formule d'un fib n est fib(n) = ( (phi)^n - (-phi)^(-n) ) / sqrt(5)phi = (1+sqrt(5)) / 2, le nombre d'or de la section. (voir ce lien ).

Vous pouvez essayer de trouver un inverse mathématique à la fonction fib ci-dessus, ou faire une recherche binaire dans 32/64 opérations (selon la taille de votre maximum consultable) pour trouver le n qui correspond au nombre (essayez chaque n en calculant fib (n) et en divisant votre espace d'échantillon en deux selon la façon dont fib (n) se compare au nombre de fibonacci donné).

Edit: La solution de @ rcollyer est plus rapide, car la mienne est en O (lg n) et celle qu'il a trouvée est en O(1) = temps constant.

3
Dan

Vous pouvez trouver n pour n'importe quelle Fib (n) dans O(1) temps et O(1) espace).

Vous pouvez utiliser un algorithme CORDIC à virgule fixe pour calculer ln () en utilisant uniquement le décalage et l'ajout de types de données entiers.

Si x = Fib (n), alors n peut être déterminé par

     n = int(2.0801 * ln(x) + 2.1408)

Le temps d'exécution de CORDIC est déterminé par le niveau de précision souhaité. Les deux valeurs à virgule flottante seraient codées comme des valeurs à virgule fixe.

Le seul problème avec cette proposition est qu'elle renvoie une valeur pour les nombres qui ne sont pas dans la séquence de Fibonacci, mais le problème d'origine a spécifiquement déclaré que l'entrée de la fonction serait Fib (n), ce qui implique que seuls les nombres de Fibonacci valides seraient utilisé.

2
oosterwal

Je pensais donc à ce problème et je pense qu'il est possible de le faire en temps O (lg n) avec l'utilisation de la mémoire O (lg n). Ceci est basé sur le fait que

F (n) = (1/√5) (Φn - φn)

Où Φ = (1 + √5)/2 et φ = 1 - Φ.

La première observation est que φn <1 pour tout n> 1. Cela signifie que pour tout n> 2, nous avons

F (n) = ⌊ Φn/√5 ⌋

Maintenant, prenez n et écrivez-le en binaire comme bk-1bk-2... b1b. Cela signifie que

n = 2k-1 bk-1 + 2k-2 bk-2 + ... + 21 b1 + 2 b.

Cela signifie que

F (n) = ⌊ Φ2k-1 bk-1 + 2k-2 bk-2 + ... + 21 b1 + 2 b/√5 ⌋

Ou, plus lisible,

F (n) = ⌊ Φ2k-1 bk-1Φ2k-2 bk-2 ... Φ21 b1Φ2 b/√5 ⌋

Cela suggère l'algorithme suivant. Commencez par calculer Φ2k pour tout k jusqu'à ce que vous calculiez un nombre Φz tel que ⌊ Φz/√5 ⌋ supérieur à votre nombre F (n). Maintenant, à partir de là, parcourez en arrière tous les pouvoirs de Φ que vous avez générés de cette façon. Si le nombre actuel est supérieur à la puissance indiquée de Φ, divisez-le par cette puissance de Φ et notez que le nombre a été divisé par cette valeur. Ce processus récupère essentiellement un bit de n à la fois en soustrayant la plus grande puissance de 2 que vous pouvez à la fois. Par conséquent, une fois que vous avez terminé, vous aurez trouvé n.

Le runtime de cet algorithme est O (lg n), puisque vous pouvez générer Φ2je par quadrature répétée, et nous ne générons que des termes O (lg n). L'utilisation de la mémoire est O (lg n), car nous stockons toutes ces valeurs.

2
templatetypedef

Cela pourrait être similaire à la réponse de user635541. Je ne comprends pas bien son approche.

En utilisant la représentation matricielle pour les nombres de Fibonacci, discutée dans d'autres réponses, nous obtenons un moyen de passer de F_n et F_m à F_{n+m} et F_{n-m} en temps constant, en utilisant uniquement le plus, la multiplication, le moins et la division ( en fait pas! voir la mise à jour). Nous avons aussi un zéro (la matrice d'identité), donc c'est un groupe mathématique!

Normalement, lors de la recherche binaire, nous voulons également un opérateur de division pour prendre les moyennes. Ou au moins division par 2. Cependant, si nous voulons passer de F_{2n} à F_n il nécessite une racine carrée. Heureusement, il s'avère que plus et moins sont tout ce dont nous avons besoin pour une recherche binaire "presque" de temps logarithmique!

Wikipedia écrit sur l'approche, ironiquement appelée Fibonacci_search , mais l'article n'est pas très clairement écrit, donc je ne sais pas si c'est exactement la même approche que la mienne. Il est très important de comprendre que les numéros de Fibonacci utilisés pour la recherche de Fibonacci n'ont rien à voir avec les numéros que nous recherchons. C'est un peu déroutant. Pour démontrer l'approche, voici d'abord une implémentation de la "recherche binaire" standard utilisant uniquement le plus et le moins:

def search0(test):
    # Standard binary search invariants:
    #   i <= lo then test(i)
    #   i >= hi then not test(i)
    # Extra invariants:
    #   hi - lo = b
    #   a, b = F_{k-1}, F_k
    a, b = 0, 1
    lo, hi = 0, 1
    while test(hi):
        a, b = b, a + b
        hi = b
    while b != 1:
        mi = lo + a
        if test(mi):
            lo = mi
            a, b = 2*a - b, b - a
        else:
            hi = mi
            a, b = b - a, a
    return lo

>>> search0(lambda n: n**2 <= 25)
5
>>> search0(lambda n: 2**n <= 256)
8

Ici test est une fonction booléenne; a et b sont des nombres consécutifs de fibonacci f_k et f_{k-1} telle que la différence entre la borne supérieure hi et la borne inférieure lo est toujours f_k. Nous avons besoin de a et b pour pouvoir augmenter et diminuer efficacement la variable implicite k.

Très bien, alors comment utiliser cela pour résoudre le problème? J'ai trouvé utile de créer un wrapper autour de notre représentation de Fibonacci, qui cache les détails de la matrice. En pratique (existe-t-il une telle chose pour un chercheur Fibonacci?) vous voudriez tout aligner manuellement . Cela vous épargnerait la redondance dans les matrices et ferait une optimisation autour de l'inversion de matrice.

import numpy as np
class Fib:
    def __init__(self, k, M):
        """ `k` is the 'name' of the fib, e.g. k=6 for F_6=8.
             We need this to report our result in the very end.
            `M` is the matrix representation, that is
             [[F_{k+1}, F_k], [F_k, F_{k-1}]] """
        self.k = k
        self.M = M
    def __add__(self, other):
        return Fib(self.k + other.k, self.M.dot(other.M))
    def __sub__(self, other):
        return self + (-other)
    def __neg__(self):
        return Fib(-self.k, np.round(np.linalg.inv(self.M)).astype(int))
    def __eq__(self, other):
        return self.k == other.k
    def value(self):
        return self.M[0,1]

Cependant, le code fonctionne, nous pouvons donc le tester comme suit. Remarquez à quel point la fonction de recherche diffère de quand nos objets étaient des entiers et non des Fibonaccis.

def search(test):
    Z = Fib(0, np.array([[1,0],[0,1]])) # Our 0 element
    A = Fib(1, np.array([[1,1],[1,0]])) # Our 1 element
    a, b = Z, A
    lo, hi = Z, A
    while test(hi.value()):
        a, b = b, a + b
        hi = b
    while b != A:
        mi = lo + a
        if test(mi.value()):
            lo = mi
            a, b = a+a-b, b-a
        else:
            hi = mi
            a, b = b-a, a
    return lo.k

>>> search(lambda n: n <= 144)
12
>>> search(lambda n: n <= 0)
0

La question ouverte restante est de savoir s'il existe un algorithme de recherche efficace pour les monoïdes. C'est celui qui n'a pas besoin d'un inverse moins/additif. Je suppose que non: que sans moins vous avez besoin de la mémoire supplémentaire de Nikita Rybak.

Mettre à jour

Je viens de réaliser que nous n'avons pas du tout besoin de division. Le déterminant du F_n la matrice est juste (-1)^n, afin que nous puissions tout faire sans division. Dans ce qui suit, j'ai supprimé tout le code de la matrice, mais j'ai conservé la classe Fib, juste parce que tout devenait extrêmement désordonné autrement.

class Fib2:
    def __init__(self, k, fp, f):
        """ `fp` and `f` are F_{k-1} and F_{k} """
        self.k, self.fp, self.f = k, fp, f
    def __add__(self, other):
        fnp, fn, fmp, fm = self.fp, self.f, other.fp, other.f
        return Fib2(self.k + other.k, fn*fm+fnp*fmp, (fn+fnp)*fm+fn*fmp)
    def __sub__(self, other):
        return self + (-other)
    def __neg__(self):
        fp, f = self.f + self.fp, -self.f
        return Fib2(-self.k, (-1)**self.k*fp, (-1)**self.k*f)
    def __eq__(self, other):
        return self.k == other.k
    def value(self):
        return self.f

def search2(test):
    Z = Fib2(0, 1, 0)
    A = Fib2(1, 0, 1)
    ...

>>> search2(lambda n: n <= 280571172992510140037611932413038677189525)
200
>>> search2(lambda n: n <= 4224696333392304878706725602341482782579852840250681098010280137314308584370130707224123599639141511088446087538909603607640194711643596029271983312598737326253555802606991585915229492453904998722256795316982874482472992263901833716778060607011615497886719879858311468870876264597369086722884023654422295243347964480139515349562972087652656069529806499841977448720155612802665404554171717881930324025204312082516817125)
2000
>>> search2(lambda n: n <= 2531162323732361242240155003520607291766356485802485278951929841991312781760541315230153423463758831637443488219211037689033673531462742885329724071555187618026931630449193158922771331642302030331971098689235780843478258502779200293635651897483309686042860996364443514558772156043691404155819572984971754278513112487985892718229593329483578531419148805380281624260900362993556916638613939977074685016188258584312329139526393558096840812970422952418558991855772306882442574855589237165219912238201311184749075137322987656049866305366913734924425822681338966507463855180236283582409861199212323835947891143765414913345008456022009455704210891637791911265475167769704477334859109822590053774932978465651023851447920601310106288957894301592502061560528131203072778677491443420921822590709910448617329156135355464620891788459566081572824889514296350670950824208245170667601726417091127999999941149913010424532046881958285409468463211897582215075436515584016297874572183907949257286261608612401379639484713101138120404671732190451327881433201025184027541696124114463488665359385870910331476156665889459832092710304159637019707297988417848767011085425271875588008671422491434005115288334343837778792282383576736341414410248994081564830202363820504190074504566612515965134665683289356188727549463732830075811851574961558669278847363279870595320099844676879457196432535973357128305390290471349480258751812890314779723508104229525161740643984423978659638233074463100366500571977234508464710078102581304823235436518145074482824812996511614161933313389889630935320139507075992100561077534028207257574257706278201308302642634678112591091843082665721697117838726431766741158743554298864560993255547608496686850185804659790217122426535133253371422250684486113457341827911625517128815447325958547912113242367201990672230681308819195941016156001961954700241576553750737681552256845421159386858399433450045903975167084252876848848085910156941603293424067793097271128806817514906531652407763118308162377033463203514657531210413149191213595455280387631030665594589183601575340027172997222489081631144728873621805528648768511368948639522975539046995395707688938978847084621586473529546678958226255042389998718141303055036060772003887773038422366913820397748550793178167220193346017430024134496141145991896227741842515718997898627269918236920453493946658273870473264523119133765447653295022886429174942653014656521909469613184983671431465934965489425515981067546087342348350724207583544436107294087637975025147846254526938442435644928231027868701394819091132912397475713787593612758364812687556725146456646878912169274219209708166678668152184941578590201953144030519381922273252666652671717526318606676754556170379350956342095455612780202199922615392785572481747913435560866995432578680971243966868110016581395696310922519803685837460795358384618017215468122880442252343684547233668502313239328352671318130604247460452134121833305284398726438573787798499612760939462427922917659263046333084007208056631996856315539698234022953452211505675629153637867252695056925345220084020071611220575700841268302638995272842160994219632684575364180160991884885091858259996299627148614456696661412745040519981575543804847463997422326563897043803732970397488471644906183310144691243649149542394691524972023935190633672827306116525712882959108434211652465621144702015336657459532134026915214509960877430595844287585350290234547564574848753110281101545931547225811763441710217452979668178025286460158324658852904105792472468108996135476637212057508192176910900422826969523438985332067597093454021924077101784215936539638808624420121459718286059401823614213214326004270471752802725625810953787713898846144256909835116371235019527013180204030167601567064268573820697948868982630904164685161783088076506964317303709708574052747204405282785965604677674192569851918643651835755242670293612851920696732320545562286110332140065912751551110134916256237884844001366366654055079721985816714803952429301558096968202261698837096090377863017797020488044826628817462866854321356787305635653577619877987998113667928954840972022833505708587561902023411398915823487627297968947621416912816367516125096563705174220460639857683971213093125)
20000

Tout cela fonctionne comme un charme. Ma seule inquiétude est que la complexité des bits domine telle- ment le calcul, que nous aurions tout aussi bien pu faire une recherche séquentielle. Ou en fait, le simple fait de regarder le nombre de chiffres pourrait probablement vous dire à peu près ce que vous regardiez. Ce n'est pas aussi amusant cependant.

1
Thomas Ahle

EDIT: Peu importe. Le demandeur a déclaré dans les commentaires que l'exponentiation n'est certainement pas un temps constant.


L'exponentiation est-elle l'une des opérations mathématiques que vous autoriserez en temps constant? Si c'est le cas, nous pouvons calculer F(n) en temps constant via la formule de forme fermée . Puis, étant donné F, nous pouvons faire ce qui suit:

  1. Calculer F (1), F (2), F (4), F (16), F (256), ... jusqu'à F (2 ^ k) <= F <F (2 ^ {k + 1})
  2. Effectuez une recherche binaire de i entre 2 ^ k et 2 ^ {k + 1} jusqu'à F(i) <= F <F (i + 1)

Si F = F (n), alors la première partie prend k = O(log(n)) étapes. La deuxième partie est une recherche binaire sur une plage de taille O (2 ^ k) , donc cela prend aussi k = O (log (n)). Donc, au total, nous avons O(log(n)) temps en O(1) espace si (et c'est un grand si) nous avons une exponentiation en O(1) temps.

1
mhum

Une forme fermée de la formule numérique de Fibonacci est:

Fn = Round(φ^n / Sqrt(5))

Où φ est le nombre d'or.

Si nous ignorons le facteur d'arrondi, il est inversible et la fonction inverse est:

F(-1)n= log(n*Sqrt(5))/logφ 

Parce que nous avons ignoré le facteur d'arrondi, il y a une erreur dans la formule qui a pu être calculée. Cependant si l'on considère qu'un nombre n est un nombre de Fibonacci si l'intervalle [n * φ - 1/n, n * φ + 1/n] contient un nombre naturel alors:

Un nombre est un nombre de Fibonacci si l'intervalle [n * φ - 1/n, n * φ + 1/n] contient un nombre naturel et l'indice de ce nombre dans la séquence de Fibonacci est donné en arrondissant le journal (n * Sqrt (5) )/logφ

Cela devrait être faisable en temps (pseudo) constant en fonction des algorithmes utilisés pour calculer le log et les racines carrées, etc.

Modifier: φ = (1 + Sqrt (5))/2

1
apokryfos