martedì 2 aprile 2013

Fattori primi


Un post altamente sperimentale, vediamo se funziona.
Parto da un suggerimento di Annarita --peccato aver già finito la scuola, da un po'.
Trovate tutto sul suo post, questo: Trova I Fattori Primi Di Un Numero [Applet].

Io uso Firefox con Linux (Ubuntu) e il caricamento dell'applet mi blocca il browser per qualche minuto, peccato. E chissà che non sia colpa mia, a fine mese verifico con la nuova versione del sistema operativo, anzi prima installo Chrome, chissà...
In ogni caso bello, provato, funziona. Ma però (sì lo so che non si dice ma per una volta, dai!) forse si possono provare altre vie. Posso vero? OK, vado. Anche perché l'ho gia fatto una volta e l'ho anche tirata per le lunghe sull'altro blog.
Ah! naturalmente non vorrei mai che queste geekkerie facessero venire l'orticaria o i brufoli (per chi l'orticaria l'ha già fatta). Diciamo che potete flammare e io smetto, subito.

Allora... scomporre il numero in fattori primi...

Immediatamente, il mio linguaggio di scripting preferito, newLISP, lo prevede già pronto:


newLISP è free, disponibile anche per Windows, piccolo e veloce, lo consiglio. A dire il vero con Linux c'è il comando factor:

Ma ci sono tanti altri modi. C'è un sito (un Wiki per la precisione) che di queste cose ne ha miriadi di miriadi (cit.). Sto parlando di Rosetta Code, io ho cercato factors e sono finito su questa pagina.

Prima sorpresa: si può fare con un batch file, per Windows, così

1
2
3
4
5
6
7
8
9
@echo off
set res=Factors of %1:
for /L %%i in (1,1,%1) do call :fac %1 %%i
echo %res%
goto :eof
 
:fac
set /a test = %1 %% %2
if %test% equ 0 set res=%res% %2

Copiate questo testo in un file (con Notepad) e salvatelo sul desktop come factors.bat.
A questo punto aprite il Prompt dei comandi e provate.


Attenzione che è lentissimo, provate solo con numeri piccoli.
Volendo si potrebbe studiarne l'algoritmo e migliorarlo, di parecchio, vero?

Haskell, un linguaggio che adesso è molto di moda, programmazione funzionale, ha una soluzione che sembra semplice ma richiede un modulo colossale, da cercare che nella posizione indicata non c'è.

Sorpresa! J: un linguaggio strano che piace ai matematti:


Sì! il programma è composto di 2 caratteri, questo: q:
Troppo semplice? Se pensate di sì sappiate che si possono ricavare altre info Leggetele, se volete sul Wiki citato.

Un linguaggio molto nerd è Perl, ecco:

1
2
3
4
5
6
sub factors
{
        my($n) = @_;
        return grep { $n % $_ == 0 }(1 .. $n);
}
print join ' ',factors($ARGV[0]),"\n";


Per Python, l'altro mio linguaggio preferito, ci sono diverse possibilità.
Eccone una semplice:


C'è anche Ruby:


Cosa abbastanza inusuale: i linguaggi tradizionali richiedono programmi lunghissimi. Ci sarebbe anche Lua con una soluzione semplice ma non l'ho ancora affrontato.

OK, smetto. Cioè, forse no. Ma potrei smettere quando voglio.

Post (naturalissimevolmente) dedicato a Marco & Annarita.

8 commenti:

  1. Grazie della dedica di questo interessante post. Penso però che sia più adatto a Marco. Il giovanotto è esperto di programmazione. Io mi limito ad esplorare le potenzialità di GeoGebra. Più in là non vado.

    RispondiElimina
  2. Intanto grazie per la dedica, ma soprattutto per questa bella sfilata di codici.

    Sono d'accordo per quanto riguarda il miglioramento da fare (per chi ne ha voglia) eventualmente sui codici che hai elencato. C'è anche da precisare però che alcuni codici elencati non trovano i fattori primi (il Batch, il Perl, il Python e il Ruby), bensì i divisori, che tu sai benissimo essere due cose diverse.

    Con i numeri primi ci ho giocato anche io in VB6 qualche anno fa ed ho scritto un programmino.
    Per chi invece vuole leggere un bel libro sulla storia dei numeri primi, consiglio "L'Enigma dei Numeri Primi"; poca matematica in formule ma tanta tanta bella storia sui personaggi che con i numeri primi hanno avuto relazioni speciali.


    RispondiElimina
    Risposte
    1. Vero; ci si potrebbe lavorarci su. Ma come detto all'inizio è un post sperimentale: interessa? quanto?

      Elimina
    2. Se interessa io posso dare una mano con il C#, Visual Basic .Net, JavaScript e/o CoffeScript (il VB6 non lo prenderei in considerazione). Mi farai sapere tu se vale la pena scrivere del codice serio.

      Elimina
    3. @ Marcopotrebbe essere un'idea, anzi è quella che mi ha fatto scrivere il post. Sentiamo anche gli altri: l'argomento interessa? O ci sono altri blog per questo. O altri strumenti, vedi sopra Annarita; io non sono aggiornato con la scuola.

      Elimina
    4. OK, vediamo l'interesse.
      Riguardo agli strumenti disponibili, sicuramente ce ne sono, è che bisognerebbe capire quale è la reale esigenza didattica. Nel mio programmino ho previsto 2 possibilità:
      1) verificare la primalità di un numero e contemporaneamente, se non è primo, scomporlo in fattori
      2) ricavare i numeri primi in un range prefissato, ad esempio da 1000 a 10000.
      Però, secondo me, il programma è utile più per fare delle verifiche che per altro: non dovrebbe sostituire la capacità dello studente di fare le fattorizzazioni. Può essere utile invece al posto delle classiche tabelle di numeri primi.

      Quello che davvero potrebbe servire è un programma o una applicazione web che sotto forma di gioco non risolva i problemi ma che invece aiuti lo studente ad esercitarsi magari divertendosi pure.
      Ma come dici tu, tutto sta al reale interesse che l'argomento suscita.

      Elimina
    5. Certo, concordo. Inoltre, se posso aggiungere una cosa, sul blog ci deve essere solo l'idea, un abbozzo da completare secondo le proprie esigenze e gusti (che è poi quello che porto avanti, o almeno ci provo).
      Vediamo se c'è interesse: c'è qualcuno lì fuori (cit. con trad.).

      Elimina
    6. La proposta di Marco è didatticamente interessante. Penso valga la pena provarci!

      Elimina