novità matematiche

Giochini matematici elementari ma non olimpici.
MindFlyer

Messaggio da MindFlyer »

Katerina89 ha scritto:Minde minde, leggi gli standard!
Lol, e tu prova a implementare quello che ho scritto! :D
La cosa mi ha incuriosito... Fatto sta che il Free Pascal (http://www.freepascal.org/) fa esattamente come dico io, e sono quasi certo che anche il Turbo Pascal della Borland facesse così (ma non posso verificare ora).
Puoi provare con qualche altro compilatore e dirmi cosa succede?

Comunque ok, se ci limitiamo ad osservare la "definizione" del Pascal, ti dò ragione e il tuo discorso di prima non fa una piega. :wink:
Avatar utente
Katerina89
Messaggi: 33
Iscritto il: 10 ott 2006, 00:33

Messaggio da Katerina89 »

prima le cose interessanti: cla e edrive, certo che il vostro conto e' giusto! :wink: :wink: e'

il fatto che non possiate farlo a suon di cicli for mica lo rende sbagliato e' :D :D :D :D :wink:

tuttavia il testo del problema non era cosi' banale perche coinvolgeva una funzione che ha questa propieta' interessate ehhhhhhh non trovate ??? :)
MindFlyer ha scritto:
Katerina89 ha scritto:Minde minde, leggi gli standard!
Lol, e tu prova a implementare quello che ho scritto! :D
La cosa mi ha incuriosito... Fatto sta che il Free Pascal (http://www.freepascal.org/) fa esattamente come dico io, e sono quasi certo che anche il Turbo Pascal della Borland facesse così (ma non posso verificare ora).
Puoi provare con qualche altro compilatore e dirmi cosa succede?

Comunque ok, se ci limitiamo ad osservare la "definizione" del Pascal, ti dò ragione e il tuo discorso di prima non fa una piega. :wink:
sara'
ma io sono andata sul sito che hai detto tu
ho scaricato l'accrocchio che hai detto tu
versione 2.1.4 [2007/05/07] for i386
scritto il tuo codice, tale e quale, che e' questo

Codice: Seleziona tutto

var __i,__j:integer;
begin

__j:=1;
for __i:=0 to __j do
   if 1=1 then
   begin
      writeln('minde minde, questo coso non funzia!');
      inc(__j);
   end;

end.
e poi l'ho lanciato
e lui cosa ha fatto?
questo:

Codice: Seleziona tutto

kate@arcturus:~$ ./minde 
minde minde, questo coso non funzia!
minde minde, questo coso non funzia!
kate@arcturus:~$ 
e nota
nota
che ha scritto due volte
minde minde, questo coso non funzia!
la prima e' perche' free pascal e' fatto bene, quindi il trucco non funziona
la seconda e' perche' anche se fosse stato fatto male, avresti dovuto scrivere
for __i:=1 to __j
e non
for __i:=0 to __j

:D :D :D :D :wink:

edit: cia' e'
MindFlyer

Messaggio da MindFlyer »

...E invece a me il tuo stesso codice produce un ciclo "infinito"! Sempre più strano. :shock:
La mia versione è la 2.0.4.
Katerina89 ha scritto: la seconda e' perche' anche se fosse stato fatto male, avresti dovuto scrivere
for __i:=1 to __j
e non
for __i:=0 to __j
La semantica è la stessa.
MindFlyer

Messaggio da MindFlyer »

MindFlyer ha scritto: La mia versione è la 2.0.4.
Incredibile, ho scaricato la 2.1.4, e lo fa nel modo giusto. :shock: :shock: :shock:
Il bello è che nel changelog non ho trovato traccia di questa modifica:
http://svn.freepascal.org/svn/fpcbuild/ ... atsnew.txt
MindFlyer

Messaggio da MindFlyer »

E poi, udite udite, ho provato col Turbo Pascal 7.0 della Borland e succede questo:
gli estremi del for vengono calcolati una volta per tutte e memorizzati, e ok.
MA il compilatore non si lamenta se io cambio la variabile del for all'interno del ciclo!
Quindi anche col Turbo Pascal è possibile simulare il while con il for.
Avatar utente
edriv
Messaggi: 1638
Iscritto il: 16 feb 2006, 19:47
Località: Gradisca d'Isonzo
Contatta:

Messaggio da edriv »

Trovare 4 * 1981 era il problema 6 delle IMO 1981.
Avatar utente
Katerina89
Messaggi: 33
Iscritto il: 10 ott 2006, 00:33

Messaggio da Katerina89 »

edriv ha scritto:Trovare 4 * 1981 era il problema 6 delle IMO 1981.
perdippiu' se qlc1 vuole provarci puo' provare a dimostrare quella cosa del for (che la *, insomma quella * strana, non si puo' fare col ciclo for e l'if soltanto)

il profe dice che e' un teorema vecchio e l'hanno dimostrato prima ancora che esistessero i compiuter, chissa' poi perche'?


Cia' e' raga!!!!11
albert_K
Messaggi: 182
Iscritto il: 10 set 2006, 19:34
Contatta:

Messaggio da albert_K »

[OT}
Ma come scrivi Katerina89?? :shock: :shock: :D
Avatar utente
edriv
Messaggi: 1638
Iscritto il: 16 feb 2006, 19:47
Località: Gradisca d'Isonzo
Contatta:

Messaggio da edriv »

Katerina89 ha scritto: perdippiu' se qlc1 vuole provarci puo' provare a dimostrare quella cosa del for (che la *, insomma quella * strana, non si puo' fare col ciclo for e l'if soltanto)

il profe dice che e' un teorema vecchio e l'hanno dimostrato prima ancora che esistessero i compiuter, chissa' poi perche'?


Cia' e' raga!!!!11
Io ci provo...

Vogliamo far vedere che la funzione x*y cresce troppo velocemente perchè si possa fare col for. Allora un punto di partenza potrebbe essere definire "velocemente".

Sia A l'insieme delle funzioni crescenti da N in N.
Se $ ~ f,g \in A $, allora dico che f è veloce almeno quanto g, e scrivo $ ~ f \succeq g $, se esistono k,n naturali tali che per ogni x>n si ha $ ~ f^k(x) \ge g(x) $. (f^k è la composizione di f k volte)
Questa relazione è riflessiva e transitiva, e quindi considerando due funzioni equivalenti se $ ~ f \succeq g \land g \succeq f $, otteniamo una relazione d'ordine sulle classi di equivalenza.
O meglio, definiamo $ ~ f \succ g $ se $ ~ f \succeq g $ ma non è vero che $ g \succeq f $.

Lemma -1: se $ ~ f(x) \ge g(x) $ per ogni x sufficientemente grande, allora $ ~ f \succ g $.
Proof: ovvio, k=1

Lemmino 0: data $ ~ f \in A $, sia $ ~ g(x) = f^x(x) $ un'altra funzione, ancora crescente. Allora $ ~ g \succ f $.
Questo perchè, per ogni k, per ogni x>k, si ha $ ~ g(x) = f^x(x) > f^k(x) $, quindi è impossibile che $ f \succeq g $, il viceversa è ovvio per il lemma -1, oppure ovvio e basta.

Lemma 1: se $ ~ f \succeq g $ e $ ~f \succeq h $ allora $ f \succeq g \circ h $. Lasciamolo al lettore :)

Ora torniamo ai nostri programmi. Sia $ ~ f \in A $, e sia g una funzione calcolata da un programma in cui sono permesse le seguenti istruzioni:
- l'uso di una qualsiasi funzione $ ~ h \in A $ tale che $ ~ f \succeq h $
- if, se proprio volete
- il for è assolutamente vietato

Vogliamo dimostrare che $ ~ f \succeq g $.
Come si fa? Poichè il for è vietato, il programma avrà un numero (fortunatamente finito) di linee, e ciascuna sarà eseguita al più una volta.
Gli if dimentichiamoceli pure, e vediamo che in ogni linea utile del programma avremo qualcosa del tipo:
variabile da qualche parte in memoria = composizione di funzioni veloci al più tanto quanto f, usando come valori quello che ho già in memoria.
Da questo, applicando tante volte il lemma 1, segue la tesi.

Ora, per quello che mi serve, il lemmino 0 è troppo debole.
Quindi mi invento il lemma 2, che è più forte del lemma 0:
Sia $ ~ f \in A $ una funzione tale che per un certo n si abbia f(n) > n+1.
Allora $ ~ f^x(0) \succ f(x) $.

Dimostrazione: per ogni k naturale, da un certo x in poi avremo $ ~ f^{x-k}(0) > x $. Questo perchè è crescente, e da un certo punto in poi $ ~ f(x) \ge x+2 $, aumenta di 2 alla volta, mentre x aumenta di 1, quindi riesce a recuperare il k che gli manca.
Ora avremo finalmente che: $ ~ f^x(0) = f^k(f^{x-k}(0)) > f^k(x) $.

Ora finalmente siamo abbastanza vicini alla fine.
Per ogni k, sia $ ~ f_k(x) = k * x $ con la * protagonista della discussione.
Per il lemma 2 (più o meno eh), avremo che $ ~ f_{k+1} \succ f_k $ per k>0.
Quindi, se vogliamo scrivere un programma per calcolare $ ~ f_{k+1} $ con a disposizione solo istruzioni per $ ~ f_i, i \le k $, ci servirà almeno un for.
Se supponiamo che il linguaggio di programmazione abbia solo a disposizione un'istruzione per incrementare una variabile, per scrivere $ ~ f_{k+1} $ servono almeno k for!

Ora, supponiamo che esista un programma che calcola x*y. Allora esiste un programma che calcola la funzione crescente c(x) = x*x, no?
Dimostriamo che $ ~ c \succ f_k $ per ogni k. Ma questo è un corollario del lemma. Quale lemma? Questo, il lemma 3:
Sia $ ~ \{g_i\}_{i \in \mathbb{N}} $ una catena di funzioni crescenti N->N tali che $ ~ i > j \Rightarrow g_i \succ g_j $. Allora, detta $ ~ G(x) = g_x(x) $, si ha $ ~ G \succ g_n $ per ogni n.
Dimostrazione: per x>n avremo $ ~ G(x) \ge g_{n+1}(x) $ quindi per il lemma -1, $ ~ G \succeq g_{n+1} $, aggiungi che $ ~ g_{n+1} \succ g_n $, per la prop. transitiva, $ ~ G \succ g_n $.

Ora è finita: supponiamo che esista un programma con i for che calcola c. Diciamo che ha n for. Ma questo implica che è impossibile che $ ~ c \succ f_{k+1} $, assurdo perchè $ ~ c \succ f_k $ per ogni k.



Argh che casino che ho scritto :shock: speriamo ci sia qualcosa di sensato.

Avrei qualche domanda, che però si basa sul fatto che ci sia qualcosa di sensato, che è un'ipotesi davvero troppo forte :(
- l'ordinamento che ho definito ha catene discendenti infinite?
Avatar utente
edriv
Messaggi: 1638
Iscritto il: 16 feb 2006, 19:47
Località: Gradisca d'Isonzo
Contatta:

Messaggio da edriv »

Che poi ho visto che l'ordinamento $ ~ \succ $ è anche totale, wow! :shock:
Avatar utente
Katerina89
Messaggi: 33
Iscritto il: 10 ott 2006, 00:33

Messaggio da Katerina89 »

boh, pensiamoci

diciamo che tu hai definito la cosa per funzioni strettamente crescenti, altrimenti casinoooo :shock: :shock: :shock: :shock:

ODIO LANCINANTE E RACCAPRICCIO[/b][/color][/size]

intanto io non sono cosi' convinta che venga un ordine totale,
insomma totale totale non lo e' e', ma penso che tu intendessi che date $ ~f $ e $ ~g $ si da sempre il caso che $ f\succeq g $ o $ ~g\succeq f $, magari, alle volte, tutteddue e'![/size][/color]

perche' questo non avvenga vogliamo quindi trovare una copia di funzioni $ ~f $ e $ ~g $ (~blah! il ~tex!) tali che


$ ~\bullet\quad\forall k,n\; \exists x>n\; g(x)>f^k(x) $
$ ~\bullet\quad\forall k,n\; \exists x>n\; f(x)>g^k(x) $

ora noi vogliamo che una certa cosa capiti per ogni coppia cappenne(capenna? conobbi un arturo capenna... capenna... capenna... sicuro! alla corte di vienna! sicuro... sicuro... sicuro...): la mia idea sarebbe di provare a cosruire le effegi un po' per volta in tanti passi. ad ogni passo prendiamo una coppia cappaenne e fissiamo il valore di effeegi su un po' di numeri, cosi' da forzare le condizioni a valere.

BEh, poniamo di aver fissato i valori assunti da effeggi su tutti i numeri fino, diciamo a diecimila, e poniamo di voler fare fallire la prima condizione per una precisa coppia cappaeenne, come facciamo? boh, fisseremo la f a caso per un po' dopo il mille, poi prenderemo un numero che sia maggiore sia di cappa che di enne e lo chiamiamo x e poi fissiamo la g a casaccio purche' su x sia piu' grande della cappaesima iterata di f (la quale abbiamo esteso per abbastanza numeri perche' questa iterata cappaesima sia definita in x)

BASTA

ORA VISTO CHE IL FENICOTTERO DEI COLORI NON FUNZIA SONO STUFA DI COLORARE E BONN

beu, non so mica se torna e' :oops: :oops: :oops:

ma, se non ho sbagliato, la stessa cosa dovrebbe funzionare anche per la faccenda della catena infinita

l'idea sarebbe che se appena ai una funzia che sale appena un po' piu' del minimo sindacale, che sarebbe che per ogni $ ~\clubsuit $ c'e' un $ ~\daleth $ tale che $ ~f(\daleth)>\daleth+\clubsuit $, allora ne puoi fare una che le sta sotto ma pur salendo anche lei piu' del minimo sindacale

eh, perche' basta che di nuovo fai le cose un ennecappa per volta: tu tieni il minimo finche' la condizione non vale per quella coppia di enneecappa e poi fai un saltino tanto per essere sicuro di non tenere il minimo sempre e passi alla coppia successiva

ehm, detto tutto questo, che ancora non sono sicura se torna :arrow: :arrow: :arrow: :arrow: :arrow: bah, non so a cosa serve questa faccina qua' ma pare che sia poco usata, poverina, :arrow: :arrow: :arrow: :arrow: :arrow:

ah, e adesso volevo pensare a quella dimostrazione....

ehm...

l'idea mi sembra che potrebbe portare qualcosa ma tu a un certo punto dici che per calcolare il cappaesimo livello servono cappa for. non e' che questo mi convinca molto, perche' tu hai fatto vedere che noto il terzo per calcolare il quarto serve un for, noto il quarto per calcolare il quinto serve un for etc. ma chi mi dice che io non possa passare direttamente dal terzo al quinto senza passare per il quarto in un solo for?

cia' e' raga'......
Avatar utente
edriv
Messaggi: 1638
Iscritto il: 16 feb 2006, 19:47
Località: Gradisca d'Isonzo
Contatta:

Messaggio da edriv »

In effetti era una dimostrazione un po' triste visto che neanche usavo il fatto che i for fossero for, potevano essere anche while, e andava lo stesso :D

Un po' di definizioni:
- consideriamo l'insieme delle funzioni $ ~ \mathbb{N} \rightarrow \mathbb{N} $ strettamente crescenti
- $ ~ a \ge b $ se esiste un n tale che $ ~ x \ge n \Rightarrow a(x) \ge b(x) $.
- $ ~ a \succeq b $ se esiste un k tale che $ ~ a^k \ge b $, dove $ ~ a^k $ è la funzione a composta k volte.
- $ ~ a \succ b $ se $ ~ a \succeq b $ e $ ~ b \not \succeq a $.
- data una funzione a, definisco $ ~ Fa(x) = a^x(x) $, cioè la funzione che per calcolare il valore su x, compone a x volte.
- iterando il procedimento, definisco $ ~ F^n a $.
- sia $ ~ \mbox{inc} $ la funzione $ \mbox{inc}(x) = x+1 $
- definiamo semplicemente $ ~ F^n = F^n \mbox{inc} $

Una proprietà interessante:
$ ~ Fa \succ a $
E' la nuova forma del "lemmino -1" del post precedente.

Ora passiamo ai programmi. Semplifichiamo un po' il concetto di programma tenendo in mente che, se cambiamo un programma mettendone uno che calcola una funzione più grande, ci va bene.
- c'è un solo input naturale e un solo output naturale.
- c'è un'unica variabile. L'unico scopo del programma e calcolare qualcosa di grande, perchè disperdere le forze?
- l'unica funzione utilizzabile è l'incremento di x.

Quindi, diamo una buona definizione di "funzione programmosa" (ovvero una funzione N->N che può essere maggiorata da un programma con solo il for):
1 - inc è una funzione programmosa (inc è la funzione inc(x) = x+1) (questo corrisponde all'istruzione di partenza, inc)
2 - se f,g sono funzioni programmose, anche la loro composizione lo è. (questo corrisponde all'unione di blocchi di istruzioni)
3 - se f,g sono funzioni programmose, anche $ ~ f^{g(x)}(x) $ lo è. (questo corrisponde all'uso del for)
4 - se f è una funzione programmosa, e $ ~ f \ge g $, allora anche g è programmosa (questo per il semplice fatto che parliamo di maggiorazioni)

Quindi, la tesi: f è programmosa se e soltanto se esiste un n tale che $ ~ F^n \ge f $. Il soltanto se segue da ripetute applicazioni dei punti 3 + una volta la 4.
Per il se, che è la parte importante, vediamo come sistemare i punti 1,2,3.

1 - $ ~ F^0 = \mbox{inc} $ per definizione.

2 - bisogna dimostrare che per ogni a,b esiste un c tale che:
$ ~ F^c \ge F^a \circ F^b $.
Basta prendere $ c= \mbox{max}\{a,b\} + 1 $. Posto k = max{a,b}:
$ ~ F^c = FF^k \ge (F^k)^2 = F^k \circ F^k \ge F^a \circ F^b $.

3 - questo è quello serio. Dimostriamo che per naturali a,b:
(x) $ ~ F(F^a)^{F^b} \ge (F^a)^{F^{b+1}} $
In realtà quello a sinistra è MOSTRUOSAMENTE più grande di quello a destra, anche se l'algebra lo nasconde.
Ora facciamo un po' di maggiorazioni stratosferiche ma simpatiche:
$ ~ F(F^a)^{F^b} = \left( (F^a)^{F^b} \right)^x = ((F^a)^{F^b})\circ((F^a)^{F^b})^{x-1} $$ ~ \ge ((F^a)^{F^b})\circ (\mbox{inc}^{F^b})^{x-1} = ((F^a)^{F^b})\circ (F^b)^{x-1} = $
$ ~ =(F^a)^{F^b(F^b^{x-1})}(F^b^{x-1}) = (F^a)^{(F^b)^x}(F^b^{x-1}) = $
$ ~ = (F^a)^{F^{b+1}}(F^b^{x-1}) \ge (F^a)^{F^{b+1}}(x) $ QED :P

Iterando la (x) quanto ci serve otteniamo la stratosferica disuguaglianza:
$ ~ F^{a+b} \ge (F^a)^{F^b} $.
Che è quello che ci serve per uccidere il punto 3.

Manca ancora un passo verso la fine: definendo
$ ~ Ga = a^x(0) $
(spero si capisca cosa vuol dire ^x)
Vorrei dimostrare che:
$ ~ Ga \succeq Fa $
Ovvero che per un certo k:
$ ~ a^{kx}(0) \ge a^x(x) $
Ma questo è molto facile, basta prendere k=2 e chiedere qualunque x tale che $ ~ a^x(0) \ge x $, e se a è definitivamente diversa dell'identità funziona.

Ora è finita!
Praticamente lo scopo era dimostrare che non esiste nessun programma che calcola $ ~ G^x \mbox{inc} (x) $. Per l'ultima cosa dimostrata, esisterebbe anche un programma che calcola $ ~ F^x(x) $. Essendo un programma, per la tesi principale di questo post, esiste un k tale che $ ~ F^k(x) \ge F^x(x) $, quindi $ ~ F^{k+1}(x) \succ F^x(x) $, ma chiaramente $ ~ F^x(x) \ge F^{k+1}(x) $ per x>k. Assurdo.
mistergiovax

Messaggio da mistergiovax »

while(i<=j)
{
if(B)
{
C; inc(j);
}
}

naturalmente all'inizio:

int i,j;
int inc(int x); e poi spiegarla.

Non so cosa c'entri, ma in clima vacanze...
Rispondi