Binôme de Newton

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Binôme de Newton

Message par Heis Spiter »

J'ai travaillé un peu sur le développement des binômes de Newton (prochaine étape : les multinômes). Bon, la première fonction permet de calculer les coefficient, et la deuxième le binôme en lui-même. La fonction est rapide jusqu'à la puissance 13. Après, c'est beaucoup plus lent, car changement de méthode de calcul (avec l'ancienne on travaille dans des nombres alors > 32 bits).

Code : Tout sélectionner

Procedure Fact(x.l)

  If x > 1
    res = 1
    For k = 1 To x
      res = res * k
    Next k
  Else
    res = 1
  EndIf
  ProcedureReturn res
  
EndProcedure

Procedure BinomialCoefficient(n.b, p.b, mode.b) 

  Select mode 
    Case 0 
      If n = p 
        ProcedureReturn 1 
      ElseIf p = 1 
        ProcedureReturn n 
      Else 
        ProcedureReturn BinomialCoefficient(n-1, p-1, mode)+BinomialCoefficient(n-1, p, mode) 
      EndIf 
    Case 1 
      ProcedureReturn Fact(n)/(Fact(p)*Fact(n-p)) 
  EndSelect 
  
EndProcedure 

Procedure.s BinomialTheorem(Exponant) 
  
  Static *coef 
  mode = 0 
  If Exponant < 14 
    mode = 1 
  EndIf 
  Midle.l = Round(Exponant/2, 1) 
  BufLen = 4*(Exponant+1) 
  If Midle*2 <> Exponant 
    Midle = Midle - 1 
  EndIf 
  *coef = ReAllocateMemory(*coef, BufLen) 
  For k = 0 To k = Midle 
    PokeL(*coef+4*k, BinomialCoefficient(Exponant, k, mode)) 
    Last = 4*k 
  Next k 
  i = 0 
  For k = BufLen-4 To Last Step -4 
    PokeL(*coef+k, PeekL(*coef+i)) 
    i = i + 4 
  Next k 
  a = Exponant 
  For b = 0 To Exponant 
    coef = PeekL(*coef+b*4) 
    tmpa.s = "" 
    If a > 1 
      tmpa.s = "a^"+Str(a) 
    ElseIf a > 0 
      tmpa.s = "a" 
    EndIf 
    tmpb.s = "" 
    If b > 1 
      tmpb.s = "b^"+Str(b) 
    ElseIf b > 0 
      tmpb.s = "b" 
    EndIf 
    If tmpa <> "" And tmpb <> "" 
      tmp.s = "("+tmpa+")*("+tmpb+")" 
    ElseIf tmpa <> "" And tmpb = "" 
      tmp.s = tmpa 
    ElseIf tmpa = "" And tmpb <> "" 
      tmp.s = tmpb 
    EndIf 
    If coef > 1 
      tmp.s = Str(coef)+"*"+tmp 
    EndIf 
    If string.s <> "" 
      string.s = string.s +"+" 
    EndIf 
    string.s = string.s +tmp.s 
    a = a - 1 
  Next b 
  ProcedureReturn string.s 
  
EndProcedure
Dernière modification par Heis Spiter le lun. 20/févr./2006 10:09, modifié 1 fois.
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Binôme de Newton

Message par flaith »

Heis Spiter a écrit :J'ai travaillé un peu sur le développement des binômes de Newton (prochaine étape : les multinômes)....
Salut et excuse moi pour la question d'un néophyte en la matière : Qu'est-ce que sont les "binômes de Newton" ainsi que leurs utilités ? :?

D'avance merci :wink:
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

"Qui baise trop bouffe un poil." P. Desproges
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

8O merci pour le lien, mais je crois que je vais aller me coucher là :oops:
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Il y a là une amusante anecdote au sujet de ce fameux binome
http://www.e-fabre.com/e-texts/souvenir ... binome.htm
Est beau ce qui plaît sans concept :)
Speedy Galerie
Répondre