11 ottobre, 2021

Dice Stirling, uh! verifico

 


Questo tweet ci ha incuriosito (Edo e me) tanto che, come dice l'amico Gottfried Wilhelm calculemus.

Si può fare (cit.) con Python, così fan (quasi) tuttə (quasi-cit.).
Ma l'hanno già fatto tanti, scorri il tweet! Sì ma poi ne aggiungiamo qualcosa che manca, forse. E tutto a distanza.

Con Python è immediato:

#!/usr/bin/python3
# stirl

from math import factorial, pi, e, sqrt, pow
from sys import argv

n = int(argv[1])
nfact = factorial(n)
stirl = round(sqrt(2 * pi * n) * pow((n / e), n))
print(n)
print(nfact)
print(stirl)
print(round(nfact / stirl, 3))
print(nfact - stirl)


ma, sai la mia fissa da sempre, il Lisp, anzi *i* perché c'è stata un'evoluzione continua, adesso Scheme, anzi Racket:

#!/usr/bin/racket
#lang racket
;; r-stir

(require math/number-theory) ; factorial
(require racket/math)        ; pi 

(define (decd x n)
  (/ (round (* (expt 10 n) x 1.)) (expt 10 n)))

(define n (string->number (car (vector->list 
          (current-command-line-arguments)))))
(println n)            

(define nfact (factorial n))
(println nfact)

(define stirl (round (* (sqrt (* 2 pi n)) 
                        (expt (/ n (exp 1)) n))))
(println (inexact->exact stirl))

(define rap (decd (/ nfact stirl) 3))
(println rap)

(println (- nfact (inexact->exact stirl)))

Ed ecco:


sì, uso qualche alias:
anche quando non si dovrebbe (rkt).

Conclusioni (si scriverebbe in ambiti seri)
I due linguaggi sono simili, si usano moduli e funzioni, e tra i due linguaggi i nomi cambiano, forse più facili quelli di Python. round() di Python è più potente dell'equivalente Racket ma basta una riga di codice per rifarla, decd (nome venuto da decimal digits, da cambiare se si prevede di usarla).
Non credo ci sia chi ricorda tutte le funzioni a mente ma c'è tutto  ontehtoobz  online, mica come una volta con i manuali cartacei (sempre imboscati da qualcuno).
La notazione matematica del Lisp è diversa ma s'impara al volo. Ed è potente e ha le sue ragioni.
Forse l'esempio è troppo semplice, ma è il tempo.
Ah! la Wiki, al solito, la sa lunga, e ci ricorda che si dovrebbe dire  Abraham de Moivre (già sentito, più volte).

🔴

Nessun commento:

Posta un commento