Newsgroup: it.hobby.enigmi
Titolo: Ancora sul Fattoriale (Estintore e Resta)

ho seri problemi a calcolare una formula, numeri molto grandi e il programma
fa cilecca me ne conta solo 1/5 del reale: la formula è questa: 90! / (4! *
(90 - 4)!) ed il risultato corretto dovrebbe essere: 10.220.760 qualcuno che
riesce a fare il calcolo me lo può confermare? Grazie.
-- 
Ludico.Net
http://www.ludico.net/index.asp?src=5

 ha scritto nel 
messaggio news:3w2he.891670$b5.39...@news3.tin.it...


 riesce a fare il calcolo me lo può confermare? Grazie.
errore nel codice, il calcolo è giusto a 2.555.xxx e non ricordo quanto,
grazie ^_^

Ogni verità è semplice, non è questa una doppia menzogna? 

90! / (4! * (90 - 4)!) = 90*89*88*87/(4!)=2555190
o anche, più direttamente,  scrivi in una cella di Excel
=COMBINAZIONE(90;4)
e restituisce il risultato 2555190
ciao
paolo

 riesce a fare il calcolo me lo può confermare? Grazie.
Nota: io, Resta e qualche altro tipo siamo la stessa persona.
E' che Resta e' molto pigro e quando ha configurato i diversi 
calcolatori dai quali posta per prova con nomi assurdi
non ha avuto piu' voglia di cambiarli.
Ti hanno gia' risposto. Comunque in generale quando vuoi calcolare
come in questo caso un coefficiente binomiale tipo (90 su 4),
tieni presente, da un punto di vista algoritmico, che il
fattoriale "grosso" sotto ammazza buona parte del fattoriale sopra.
Quindi e' meglio calcolarlo come qualcosa tipo
90*89*88*87/ (1*2*3*4) o se per esempio era (100 su 5) come
100*99*98*97*96 / (1*2*3*4*5), cioe' (n su k) corrisponde a k fattori
a scendere sopra, partendo da n, e a k fattori a crescere sotto, 
partendo da 1.
ciao,
g.

riesce a fare il calcolo me lo può confermare? Grazie.
Quale programma?
Perche' questo programma in C, fatto male da me, imbroglia
anche lui ma da 170 in poi.
=-=-=-=-=-=-=- cut here --=-=-=-=-=-=-=-
#include <stdio.h>
double numero, fatt, j;
main()
{
numero=1;
printf("\nn minore 170; per USCIRE n = 0");
while (numero>0)
{
fatt=1;
printf("\nn  = ");
scanf("%lf", &numero);
for (j=1; j<=numero; ++j)
fatt=fatt*j;
printf("n! = %.0lf",fatt);
printf("\n");
}
return 0;
}
=-=-=-=-=-=-=- cut here --=-=-=-=-=-=-=-
-- 
Ciao,		|   Attenzione! campo "Reply-To:"  alterato	|
Remigio Zedda	|   posta: ti.ilacsit@zoigimer  <-- dx/sn  ;^)	|
	-- GNU/Linux 2.4.25 su Slackware 9.1

 confermare? Grazie.
Piglia una calcolatrice scientifica (no, quella del Dixan non va bene)
e pigi 90 nCr 4. Costa meno di excel, e all'esame di calcolo delle
probabilità è sicuramente più pratico.
-- 
www.mukkarasta.it
(ebbene sì, anche il mio gruppo ha un sito)

 e restituisce il risultato 2555190
questa mi tornerà molto utile, la stavo cercando infatti, grazie!

 Ogni verità è semplice, non è questa una doppia menzogna?
eh?

 anche lui ma da 170 in poi.
forse non si è letto il mio messaggio di correzione
il C qualcosa conosco ma alcune cose che hai scritto
mi sono poco chiare, ecco la mia formula VB:
Private Function FAT(intBase As Integer) As Double
  Dim dblResult As Double
  dblResult = intBase
  If intBase = 0 Then FAT = 1: Exit Function
  For i = intBase - 1 To 1 Step -1
    dblResult = dblResult * i
  Next i
  FAT = dblResult
End Function

 probabilità è sicuramente più pratico.
calcolatrice SHARP a 90 va in errore :) credo che usare come
alternativa una qualsiasi calcolatrice ad un PC sia, nelle migliori
delle ipotesi, assurdo.

 delle ipotesi, assurdo.
Uh! Strano... anche la mia Sharp (el-9400) si rifiuta.
In compenso il muletto (TI-36XII) non fa una piega. Scriverò due righe
al signor Sharp, è il caso che torni a fare i popolari accessori per
colli infreddoliti
:|


 ha scritto nel
messaggio
news:3w2he.891670$b5.39...@news3.tin.it...
FINITO!
Dunque, fa tutte le combinazioni possibili da ambo a cinquina, nello
scenario peggiore
(cinquina con 90 numeri) impiega circa 10 minuti sul mio P4 2000 e genera il
file grande
quasi 665 Mb come tempi vi sembrano ragionevoli? Ma soprattutto, come
caspita si
apre un file di testo cosě grande?


E soprattutto, cosa cavolo ti serve vedere 43.949.268 cinquine?
(Se vuoi filtrarle sottoponendole ad eventuali condizionamenti
non mi sembra sia necessario averle memorizzate su un file; e, in
ogni caso, esistono già in commercio fin troppi programmi per
il lotto)
Nino 

Private Function FAT(intBase As Integer) As Double
-cut-
Ma l'hai testata? Perche' io mi sono accorto
dell'imbroglio quando ho visto che 22! ha quattro zeri
ed invece 23! nessuno.
E gli zeri non possono che aumentare, anzi una previsione
di minima per l'aumento non sarebbe neppure difficile
calcolarla.
[apropos funziona fino a 22, non 170 come avevo scritto,
e il motivo prima o poi lo scopriro`]


Ma soprattutto, come caspita si apre un file di testo cosě grande?
Vuoi dire per visualizzarlo? Word ce la dovrebbe fare
tranquillamente, no? Access ne dovrebbe fare/gestire
anche ben piu` grandi.. pero` non lo conosco, lo dico
a orecchio.


 e il motivo prima o poi lo scopriro`]
?? ma parli della mia o della tua?

 il lotto)
sono solo prove che faccio, ero partito dal voler
fare un programma per le combinazioni, tutto quì

 a orecchio.
word si pianta a quello della quaterna, da 2.555m combo
mi pare inutile provare con l'altro 20 volte + grande...

?? ma parli della mia o della tua?
Mia :-)))



Non spaventarti, va su tutte le piattaforme, si chiama Vim
ma viene chiamato/linkato a Vi, per tradizione Unix.
E` praticamente [*] il piu` potente editor in assoluto.
Solo che e` piuttosto ostico nei comandi, finche' non ci
fai la mano. Ora ti sto scrivendo da Elvis, un altro
clone di Vi, praticamente indistinguibile da Vim.
Per dirtene una di frequentissima applicazione: puoi
tagliate strisce verticali da uno a 81 caratteri, esempio
in un solo colpo posso togliere tutte le quote ">" da
questa pagina.
<RELIGION WAR>
[*] Non me ne vogliano gli Emacs-iani
</RELIGION WAR>


 ed invece 23! nessuno.
Quello che dico si riferisce al C ma si applica pari pari anche
al Basic.
Il motivo e' ovvio. Il tipo di dato double (come tutti i tipi
di dato di base del C) ha una certa precisione finita.
Di solito occupa 8 bytes=64 bit), nei quali deve starci anche il segno
e l'esponente (stiamo parlando di numeri in floating point, quindi
sono espressi in un forma del tipo  .1010101010... * 2^(101010)
Tipicamente il segno occupa 1 bit, la mantissa (la cui prima cifra e'
sempre 1, a meno che il numero sia 0) occupa 53 bit e l'esponente i
rimanenti 11.  (possono esserci delle varianti, ma le cose sono
piu' o meno cosi').
Consideriamo 22! = 1124000727777607680000
Il logaritmo in base 2 e' circa 69.9 quindi non dovrebbe essere 
possibile rappresentarlo esattamente con soli 53 bit di mantissa.
Pero' dobbiamo tenere conto che 22! e' divisibile esattamente per 2^19.
Quindi questi bit li "risparmiamo" e siccome 69.9-19=50.9 allora 
possiamo rappresentare esattamente 22! in un double.
Invece, siccome il logaritmo di 23! e' 74 e qualcosa, anche sottraendo
19 eccediamo i bit di precisione offerti dalla mantissa.
Quindi i numeri fattoriali dal 23 in poi non possono essere 
rappresentati esattamente in un double. Possono solo essere 
rappresentati in modo approssimato. Se tu chiedi al calcolatore
di stampare un numero double con una precisione superiore a quella che
ha, probabilmente (non sono sicuro) lui allunga idealmente la mantissa 
aggiungendo degli 0 (binari). Questo fa si che nella stampa dei 
fattoriali da 23! in poi le cifre meno significative siano dal nostro
punto di vista pressoche' a caso.
Se proprio uno vuole calcolare numeri fattoriali grandi con precisione
all'ultima cifra, e' meglio che usi una libreria per il calcolo in
precisione arbitraria, come la libreria GMP della GNU.
ciao,
g.

precisione arbitraria, come la libreria GMP della GNU.
TNX per la spiegazione:-)
Per il calcolo esatto non ho problemi, perche' ho messo
nella calcolatrice Bc di Linux la seguente funzione:
define f(n){
if (n <=1) return (1);
return (f(n-1)*n);
}
e con Bc non so neppure che limite ci sia: ho appena
inviato su f(1000000) e l'ha preso.. vediam quanto ci
mette. Uhm forse la fermo, son gia`: 2'.. 4'.. 5'.. be'
c'ho un p900 con 512 mega di RAM meschino.. 6'.. 8'..
e non sta usando neppure molta memoria, guarda:
             total       used       free     shared    buffers     cached
Mem:           503        203        299          0          3         62
-/+ buffers/cache:        137        365
Swap:          243          0        243
e poi la rivediamo quando esce.. siamo a 12'.. no
interrompo, ora do 1000, pressoche' istantanea,
10.000: 12", 100.000: no son gia` tre minuti, esco.
Ecco la memoria:
             total       used       free     shared    buffers     cached
Mem:           503        203        299          0          3         62
-/+ buffers/cache:        136        366
Swap:          243          0        243
identica, ciao:-)


 mette. 
beh... 10^6! e' un numero un po' grandino. Mi sembra che occupi circa
20 milioni di bit (senza contare l'overhead). Quindi e' verosimile
che ci metta abbastanza tempo.
Comunque usando sotto C la libreria GMP della GNU per il calcolo
in precisione arbitraria (che ha gia' una funzione predefinita per
il fattoriale), il calcolo e la conversione in stringa di 100.000! 
prende poco piu' di un secondo.
ciao,
g.

non ha avuto piu' voglia di cambiarli.
Sul CARO ESTINTORE avrei qualche curiosita'. Se non fosse per la tua
nota ritrosia per i giochi di parole, opterei per un anagramma tipo:
arnese ricotto, attore sincero, orso recitante, cantore restio, sterco
aretino, Resta 'o cretino, stronca-teorie, ricrea sonetto, eros
recintato, scarno reietto, eretico strano, atroce in estro...
Abbi pazienza, lo sai bene che non sono farina del mio sacco... sono
tutti tuoi "nipoti" ;-)
Robby
-
-------------------------------------------------------------
Per risposte private, togliere TUTTE le "x" dal mio address !
For private replies, remove ALL the "x" from my address !
-------------------------------------------------------------

 recintato, scarno reietto, eretico strano, atroce in estro...
arnese ricotto ormai lo sono, visto che tra un mese faccio i 41...
attore sincero e' praticamente un ossimoro.
stronca-teorie mi si addice.
scarno reietto un po' meno perche' peso quasi 120Kg.
cantore restio di sicuro, almeno in pubblico.
Resta 'o cretino lo divento ogni giorno di piu' nel senso corrente
del termine mentre non lo sono piu' nel senso etimologico del termine.
eretico strano sarei potuto esserlo in gioventu': ormai
ho raggiunto la convinzione che discutere di "grandi temi"
sia un inutile spreco di energie nervose o di tempo, a seconda dei casi.
sugli altri stendo un velo pietoso....
ciao,
g.