Bound Sort

Ho inventato un algortimo di ordinamento piuttosto efficiente (non chiedetemi quanto perchè ho provato a capire come si misuri l’efficienza di un algoritmo ma è una causa persa). L’ho confrontato con un’implementazione il bubble sort, e su liste abbastanza lunghe (dai 15 elementi in su, anche ripetuti) è decisamente migliore.
L’ho chiamato Bound sort poichè crea la lista ordinata a partire dai suoi estremi destro e sinistro.

Ecco i passaggi dell’algoritmo:

  1. Si trova il numero maggiore della lista, memorizzando il valore più grande che trova man mano che itera nella lista
  2. Si trova il numero minore della lista, memorizzando il valore più piccolo che trova man mano che itera nella lista
  3. Si aggiungono tutti i numeri della lista uguali al maggiore alla fine di una seconda lista
  4. Si aggiungono tutti i numeri della lista uguali al minore all’inizio della seconda lista
  5. Si rimuovono dalla prima lista tutti gli elementi uguali al maggiore o al minore trovati
  6. Si ripete il procedimento finchè non rimangono più numeri nella prima lista
  7. La seconda lista conterrà tutti gli elementi della prima in ordine crescente

Ed eccone un’implementazione in VB.NET:

Function BoundSort(ByVal ListToSort As List(Of Integer)) As Integer()
Dim SortedList(0 To ListToSort.Count - 1) As Integer
Dim Min as Integer
Dim Max as Integer
Dim posMax As Integer = ListToSort.Count - 1
Dim posMin As Integer = 0
Dim n As Integer

Do
      Min = ListToSort.Item(0)
      Max = ListToSort.Item(ListToSort.Count - 1)

      'trovo il maggiore e il minore
      n = 0
      For Each n In ListToSort
            If n < Min Then Min = n
            If n > Max Then Max = n
      Next

      'aggiungo alla fine della lista i maggiori
      n = 0
      For Each n In ListToSort
            If n = Max Then
                  SortedList(posMax) = n
                  posMax -= 1
            End If
      Next

      'aggiungo all'inizio della lista i minori
      n = 0
      For Each n In ListToSort
            If n = Min Then
                  SortedList(posMin) = n
                  posMin += 1
            End If
      Next

      'elimino maggiori e minori
      ListToSort.RemoveAll(Function(x As Integer) x = Max Or x = Min)
Loop Until ListToSort.Count = 0
Return SortedList
End Function

Il fatto che usi una lista invece che un array è puramente pratico, poichè operazione di aggiunta/rimozione sono molto più facili per una lista piuttosto che per un array.

Fusione nucleare: non è una favola

Stamattina a scuola durante l’ora di matematica, spiegando il quinto postulato di Euclide, la prof ha cominciato a parlare delle geometrie non-euclidee e della loro applicazione nella fisica.
Dopo un’immensa sfilza di castronate direi relativistiche si è arrivati a parlare della fusione nucleare e della sua eventuale riproducibilità per produrre energia elettrica.

Quando la prof ha negato categoricamente la possibilità di fare tutto ciò, mi sono un po’ arrabbiato diciamo e le ho chiesto: e la fusione fredda?

Cos’è la fusione fredda?
La fusione fredda non è altro che un processo di fusione nucleare che avviene basse temperature e pressioni, con un basso dispendio di energia a fronte di un uguale produzione. Esattamente identica a quella che avviene all’interno delle stelle ma a pressioni e temperature enormemente più alte (nel sole avviene a una temperatura di 13 milioni di gradi e a una pressione di 500 miliardi di atmosfere).

E’ stata molto dibattuta la possibilità o meno di eseguire la fusione fredda: tantissimi ci hanno provato con successo, altrettanti senza successo. Ma alcuni esperimenti davvero seri si fa fatica a ignorarli.
In particolare, qui in Italia, a Bologna, due professori di fisica hanno sviluppato un piccolo (ma ben funzionante) reattore a fusione fredda in grado di produrre ben 12 kW di energia con un consumo di soli 400 W:

Un altro ottimo risultato è stato quello di due scienziati giapponesi che hanno ottenuto buoni risultati con un metodo differente. La loro soluzione è però controversa poichè non è stato possibile riprodurlo in altri laboratori.

Ci sono anche tante altre macchine che riescono a sviluppare una reazione di fusione (normale) controllata, tramite potenti campi magnetici che stabilizzano la materia in fusione. In Francia, Inghilterra e Giappone la ricerca in questo campo è piuttosto avanti e i risultati promettenti, ma confrontare questi mastodontici progetti con quelli ben più modesti (ma altrettando produttivi) di reattori a fusione fredda è sconvolgente.
Non è ben più comodo un mini-reattore che sta in una stanza che un gigantesco reattore che sta in un aeroporto?

Ma la vera domanda da farsi sarebbe: perchè in Italia inseguiamo ancora il sogno delle centrali a fissione, pericolose e (a mio parere) irrealizzabili in questo paese, quando abbiamo, anche a casa nostra, delle ben migliori centrali a fusione?
Mistero.

La sintetizzazione matematica

Questo articolo è in risposta a quest’altro articolo su Pierotofy.it

La scrittura di formule matematiche si è radicalmente modificata dai suoi albori a oggi.
Ai suo inizi (parliamo di Egizi e Babilonesi) tutto era scritto per esteso, ad esempio “5 + 8 = 13” diventava un lunghissimo “cinque più otto uguale tredici”.
Più avanti è nata l’algebra sincopata, ossia con abbreviazioni.
Fu Diofanto a introdurre, nel III secolo a.C., l’algebra sincopata: questo metodo di scrittura prevedeva ancora la notazione per esteso, ma concedeva qualche abbreviazione per rendere più spedita la scrittura e la lettura dei calcoli matematici; “5 + 8 = 13” diventava “5 più 8 è 13”.
Verso la metà del 1550 nasce invece l’algebra simbolica, quella odierna, dove non usiamo più parole ma lettere o simboli.

Sono d’accordo con te finchè rimani nell’ambito informatico. Se devi fare un programma che calcola dei moti, chiamare una variabile V è abbastanza scema come cosa, meglio chiamarla Velocità, Speed, Velocity, così diventa più chiaro per te e per eventuali consultatori del tuo sorgente.
Ma se in matematica o anche in fisica, che allo stato attuale delle cose sono abbastanza avanti in quanto a complessità, dovessi scrivere tutto per esteso, diventi matto. Pensa te come diventerebbe la dimostrazione dell’ultimo teorema di Fermat se dovesse essere tutta scritta così! Ancora più incasinata di com’è di suo!
Ed è anche un notevole aiuto per chi studia. A mio parere, è più semplice ricordarsi una definizione simbolica che una a parole. Sintetizzare significa anche rendere più chiaro, instaurare meccanismi logici e mentali che aiutano (e non poco) a organizzare le informazioni, oltre a renderle più velocemente disponibile.
Poi è indubbio che ogni tanto ti puoi confondere, ma in nome di questo non ritornerei alla notazione babilonese.