Visto nel Web – 241

Fa caldo ma come al solito ecco cosa ho visto nel Web.

Scala is the new golden child
#:linguaggi di programmazione
::: TechCrunch

Why Does a Hacker Must be a Good Programmer?
#:programming, codice, snippet
::: Technotification

How to download Coursera’s courses before they’re gone forever
#:manuali, how to
::: freecodecamp

Y Combinator’s Xerox Alto: restoring the legendary 1970s GUI computer
::: Ken Shirriff’s

Python machine learning book
work in progress
#:manuali, how to
::: rasbt


Apple won’t aid GOP convention over Trump
::: fabiochiusi

Logarithm multiplication
l’amico Marco Fulvio mi ricorda quando ero giovane; e il regolo so usarlo ancora
::: Marco Fulvio’s Dust

Infinite recursion
::: ThePracticalDev

Graph Traversal Algorithms
#:programming, codice, snippet
::: WorkShape

South Australia Refuses To Stop Using An Expired, MS-DOS-Based Health Software
#:tools, componenti software
::: Slashdot


New Ransomware Written Entirely In JavaScript
#:sicurezza, spionaggio
::: Slashdot

Big Tech Squashes New York’s ‘Right To Repair’ Bill
#:hardware #:ditte
::: Slashdot

California Researchers Build The World’s First 1,000-Processor Chip
#:hardware #:innovazioni, futuro
::: Slashdot

La risposta del Centro Nexa alla consultazione pubblica sul ruolo degli editori nella catena del valore del copyright e sulla eccezione di panorama
::: Nexa

The Essence of Scala
#:programmazione funzionale
::: Scala


Go Debian
#:linguaggi di programmazione
::: Grab the Blaster

Go static – ovvero il vademecum di GitLab sugli static site generator
#:tools, componenti software #:Web, Internet
::: Grab the Blaster

If #science is going to save the world, we need to make it open
::: wef

China Builds World’s Fastest Supercomputer Without U.S. Chips
::: Slashdot

Alan Kay: Development environments should help programmers think
#:programming, codice, snippet
::: RainerJoswig ::: RainerJoswig


RT @dysinger Can’t reach the pedals. no brakes. gaining speed. eyes bulging in horror. technical debt crash imminent
::: opbeat

Coconut: functional programming language, compiles to Python
#:linguaggi di programmazione
::: dloss

Autocomplete based upon type information
::: JJoeKoullas

And you shouldn’t design a language if you don’t understand why null is the billion dollar mistake, but here we are
#:programming, codice, snippet
::: bmastenbrook

HOWTO: Classic, apt-based Ubuntu 16.04 LTS Server on the rpi2!
#:hardware #:sistemi operativi
::: From the Canyon Edge


Broken Hardware, Fixes and Hacks over 8 Years
::: HookRace

Hypothesis testing and number theory
non so se è pertinente al blog ma intriga
#:programming, codice, snippet
::: John D. Cook

Occhio a Paypal: nuova campagna phishing
#:sicurezza, spionaggio
::: EPietrafesa

High IQ Countries Have Less Software Piracy, Research Finds
::: TorrentFreak

Mark Zuckerberg Votes To Keep Peter Thiel On Facebook Board
#:ditte #:Web, Internet #:sicurezza, spionaggio
::: Slashdot


One year as a Data Scientist at Stack Overflow
#:Web, Internet
::: Variance Explained

Smartphone Users Are Paying For Their Own Surveillance
#:sicurezza, spionaggio
::: Slashdot

Revealed: the day Guardian destroyed Snowden hard drives under watchful eye of GCHQ – video
#:sicurezza, spionaggio
::: The Guardian

Stop saying learning to code is easy
#:programming, codice, snippet
::: Scott Hanselman

Sweden asks to meet Julian Assange inside Ecuador embassy
chissà se…
#:sicurezza, spionaggio
::: the Guardian


Advisor to the Court of Justice of the EU: copyright law must evolve with technology
::: Communia

The Digital Economy & Society Index (DESI)
#:economia #:Web, Internet
::: European Commission

minaccia: un giorno che sono giù lo installo e ci bloggo su, nèh!😳
#:linguaggi di programmazione
::: Coconut

Parallel Python – Making Code Run 2000x Faster
#:programming, codice, snippet
::: Go Parallel

Epiphany vuole essere il nuovo Electron
#:Web, Internet
::: Grab the Blaster


I do not use a debugger
io ho debbuggato parecchio molto tempo fa; adesso molto meno, anzi quasi niente
#:programming, codice, snippet
::: Daniel Lemire

Meta Moore’s Law
::: arialdomartini

Microsoft: Nearly One In Three Azure Virtual Machines Now Are Running Linux
#:sistemi operativi
::: Slashdot

Five lemma, ASCII art, and Unicode
#:tools, componenti software
::: John D. Cook

Jim Porter and the History of the Global Storage Industry
::: Computer History Museum


3 Million Strong Botnet Grows Right Under Twitter’s Nose
::: Slashdot

Scoperta grave vulnerabilità su Windows presente da 20 anni
::: Tech Economy

Intercettazioni con i trojan di Stato: ecco la proposta di legge
c’è ancora Pisanu?
#:sicurezza, spionaggio
::: la Stampa

Democratize the Internet Now!
#:Web, Internet
::: New Republic

The New Censorship: ‘How Did Google Become The Internet’s Censor and Master Manipulator?’
non solo Google
#:Web, Internet #:censura
::: Slashdot


Why Drones Could Save Door-To-Door Mail Delivery
#:innovazioni, futuro
::: Slashdot

Chomping down on bash’s brace expansion
s’impara sempre qualcosa (colpa mia le {} le usavo su Apollo ma non sapevo che ci sono anche qua
#:tip suggerimenti
::: ComputerWorld

3 cose su Linux che l’utente Windows dovrebbe sapere
#:sistemi operativi
::: Tech Economy

Full Circle Magazine #110 is out!
#:programming, codice, snippet
::: fullcirclemag

limit the CPU usage of Firefox / Dropbox / etc.
::: The Ubuntu Incident


Lkely next UK PM Boris Johnson called for end to Assange siege “It’s absolutely ridiculous,”
#:sicurezza, spionaggio
::: wikileaks

74% of Netflix Subscribers Would Rather Cancel Their Subscription Than See Ads
#:Web, Internet #:spam
::: Slashdot

White House warns Congress not to kill net neutrality and cable box rules
#:Web, Internet
::: Ars Technica

Russia’s new Big Brother law is an unworkable, unjustifiable violation of rights that should never be signed
#:sicurezza, spionaggio
::: Snowden


Posta Elettronica e Sicurezza. Qual è la situazione?
#:sicurezza, spionaggio
::: Tech Economy

Why did Google choose Java as default application programming language for Android
#:linguaggi di programmazione #:dispositivi mobili
::: Techworm

Java, PHP, NodeJS, and Ruby Tools Compromised By Severe Swagger Vulnerability
#:sicurezza, spionaggio
::: Slashdot

Software that gets used
considerazioni semplici che condivido in pieno
#:programming, codice, snippet
::: John D. Cook

newtons cradle with light bulbs

SICP – cap. 1 – Esempio: test di primalità – esercizi – 28


Proseguendo da qui oggi esercizi, qui.

Exercise 1.21.  Use the smallest-divisor procedure to find the smallest divisor of each of the following numbers: 199, 1999, 19999.


Uh! semplicissimo (mi sfugge qualcosa?); con i medici si dice sentire un altro parere:


OK, torna. È ora di vedere i miei solutori preferiti, no nessuno che dice niente più di quel che ho detto io; l’esercizio è troppo facile, allerta per cosa ci prepara.

Exercise 1.22.  Most Lisp implementations include a primitive called runtime that returns an integer that specifies the amount of time the system has been running (measured, for example, in microseconds). The following timed-prime-test procedure, when called with an integer n, prints n and checks to see if n is prime. If n is prime, the procedure prints three asterisks followed by the amount of time used in performing the test.

(define (timed-prime-test n)
  (display n)
  (start-prime-test n (runtime)))
(define (start-prime-test n start-time)
  (if (prime? n)
      (report-prime (- (runtime) start-time))))
(define (report-prime elapsed-time)
  (display " *** ")
  (display elapsed-time))

Using this procedure, write a procedure search-for-primes that checks the primality of consecutive odd integers in a specified range. Use your procedure to find the three smallest primes larger than 1000; larger than 10,000; larger than 100,000; larger than 1,000,000. Note the time needed to test each prime. Since the testing algorithm has order of growth of O(n), you should expect that testing for primes around 10,000 should take about 10 times as long as testing for primes around 1000. Do your timing data bear this out? How well do the data for 100,000 and 1,000,000 support the n prediction? Is your result compatible with the notion that programs on your machine run in time proportional to the number of steps required for the computation?

Ecco; come previsto😳
OK, entrino i supporti, Bill the Lizard è dettagliato, considera una mancanza in Scheme — chissà se Racket…, sì anche Racket.

(define (timed-prime-test n)
   (display n)
   (start-prime-test n (current-inexact-milliseconds)))

(define (start-prime-test n start-time)
   (cond ((prime? n)
          (report-prime (- (current-inexact-milliseconds) start-time)))))

(define (report-prime elapsed-time)
   (display " *** ")
   (display elapsed-time))

(define (smallest-divisor n)
   (find-divisor n 2))

(define (find-divisor n test-divisor)
   (cond ((> (square test-divisor) n) n)
         ((divides? test-divisor n) test-divisor)
         (else (find-divisor n (+ test-divisor 1)))))

(define (divides? a b)
   (= (remainder b a) 0))

(define (square x)
   (* x x))

(define (prime? n)
   (= n (smallest-divisor n)))



e poi


e, dopo qualche tentativo


e anche


Ken Dyck ha un approccio diverso, funziona solo nell’ambiente integrato (cioè no, ma con DrRacket è più facile). Interessante, da vedere di là😉
S-sol ha una soluzione diversa ancora, d vedere.
Bravo anche Spaceman Aki😀
Ci sarebbe anche Eli Bendersky che (al solito) rockz ma usa il Common Lisp (CL); per adesso lo salto (anche se…)


Octave – inizio davvero – 6

3YeContinuo dal post precedente, sono sempre nel Getting Started, qui.

Chiudere Octave
Shutdown is initiated with the exit or quit commands (they are equivalent). Similar to startup, Octave has a shutdown process that can be customized by user script files. During shutdown Octave will search for the script file finish.m in the function load path. Commands to save all workspace variables or cleanup temporary files may be placed there. Additional functions to execute on shutdown may be registered with atexit.

Per adesso ci bastano i due comandi equivalenti quit e exit. Per Linux, al solito, si può usare il solito C-d.

Pronto al prossimo argomento, qui.

Comandi per chiedere aiuto.
A me ha chiesto di installare octave-info.

The entire text of this manual is available from the Octave prompt via the command doc. In addition, the documentation for individual user-written functions and variables is also available via the help command. This section describes the commands used for reading the manual and the documentation strings for user-supplied functions and variables. See Function Files, for more information about how to document the functions you write; questo solo per utenti über-esperti, come vedremo in futuro.

I comandi disponibili sono parecchi, tanti, troppi. Li elenco senza commenti (c’è l’help). Nell’elenco ci sono anche funzioni perché il manuale è per tutti: novellini e esperti.

Command: help name
Command: help --list
Command: help .
Command: help

Command: doc function_name
Command: doc

Command: lookfor str
Command: lookfor -all str
Function File: [fcn, help1str] = lookfor (str)
Function File: [fcn, help1str] = lookfor ("-all", str)

Command: news
Command: news package

Built-in Function: val = info_file ()
Built-in Function: old_val = info_file (new_val)
Built-in Function: info_file (new_val, "local")

Built-in Function: val = info_program ()
Built-in Function: old_val = info_program (new_val)
Built-in Function: info_program (new_val, "local")

Built-in Function: val = makeinfo_program ()
Built-in Function: old_val = makeinfo_program (new_val)
Built-in Function: makeinfo_program (new_val, "local")

Built-in Function: val = texi_macros_file ()
Built-in Function: old_val = texi_macros_file (new_val)
Built-in Function: texi_macros_file (new_val, "local")

Built-in Function: val = doc_cache_file ()
Built-in Function: old_val = doc_cache_file (new_val)
Built-in Function: doc_cache_file (new_val, "local")

Built-in Function: val = built_in_docstrings_file ()
Built-in Function: old_val = built_in_docstrings_file (new_val)
Built-in Function: built_in_docstrings_file (new_val, "local")

Built-in Function: val = suppress_verbose_help_message ()
Built-in Function: old_val = suppress_verbose_help_message (new_val)
Built-in Function: suppress_verbose_help_message (new_val, "local")

Function File: doc_cache_create (out_file, directory)
Function File: doc_cache_create (out_file)
Function File: doc_cache_create ()

Built-in Function: [text, format] = get_help_text (name)

Built-in Function: [text, format] = get_help_text_from_file (fname)

Function File: text = get_first_help_sentence (name)
Function File: text = get_first_help_sentence (name, max_len)
Function File: [text, status] = get_first_help_sentence (...)

Avvertenza: non vorrei che l’elenco vi spaventasse; io per esempio lo ignoro, ignoro cosa significhi😳


Emoji come se piovesse; basta chiedere


OK, non so se serve –anzi mooolto probabilmente no: ❎  ❌  🚫  ◼  🙅  ⏰  🅱, nope: 🙅  ✋  🚫  👐  ❌  😂  👋.

Ma l’idea c’è e poi mi serve per provare il nuovo editor di WordPress. Nuovo si fa per dire, è nuovo per me che sono rimasto ancora al vecchio.

Allora il programma eseguibile da terminale è emoj, dovuto a sindresorhus, che è anche una tweetstar 🔝
Trovate tutto qui; l’unica avvertenza è che se dovete installare (come me) npm dovete farlo come root, quindi con sudo, nèh!

Poi funziona,


Siccome sto provando l’editor aggiungo uno script, senza senso, solo per vedere come viene.

if [ $# -eq 0 ]; then
    echo Ciao $USER!
    echo Ciao $1!

Funziona? l’editor intendo 🙅


Octave – inizio davvero – 5


Continuo da qui. Come sono solito seguo scrupolosamente –quasi– il manuale, in questo caso GNU Octave — Copyright © 1996-2016 John W. Eaton.
Ma dopo l’Introduzione c’è un sotto-capitolo sulle Convenzioni usate nel manuale che non ha senso riportare qui.
Passo pertanto al secondo capitolo, Getting Started, sintetizzando anche qui.

Lanciare Octave
Normally, Octave is used interactively by running the program ‘octave’ without any arguments. Once started, Octave reads commands from the terminal until you tell it to exit.

You can also specify the name of a file on the command line, and Octave will read and execute the commands from the named file and then exit when it is finished.

You can further control how Octave starts by using the command-line options described  in the next section [qui di seguito], and Octave itself can remind you of the options available. Type ‘octave --help’ to display all available options and briefly describe their use (‘octave -h’ is a shorter equivalent).

Opzioni per la command line
Sono tante, di solito ne serve solo qualcuna, quelle che elenco. Le restanti sono qui.
Per eseguire codice si usa l’opzione --eval code. Per eseguire un programma su file si passa a Octave il nome del file (come si fa da sempre).
Per avere l’eco dei comandi eseguiti ci sono --echo-commands e -x
Per avere l’help  ci sono --help, -h, -?
Per eseguirlo nel terminale si usa --no-gui.
Per eliminare il messaggio iniziale ci sono --silent, --quiet, -q
Esiste anche il debug --debug o -d
Per tutti gli altri vedi qui o usa --help (o -h).

Files di startup
When Octave starts, it looks for commands to execute from the files in the following list. These files may contain any valid Octave commands, including function definitions.
Per sapere quali sono e cosa sono vedi qui.

Io mi sono creato l’alias per eseguirlo nel terminale interattivamente (cosa che si chiama REPL):

alias roc='octave -q --no-gui'

Per chi usa Windows si può creare un batch file, ma credo siano più abituati all’ambiente integrato.

Continua, ma adesso pausa😀


Espressioni matematiche – indice

ruotePartendo da un post su Facebook di Roberto proooof Zar Zanasi ho pubblicato un po’ di roba, vista da un ingegnere civile che si è occupato anticamente di programmazione. Naturalmente una visione personale, so di non sapere (cit.); sono carente per quanto riguarda la matematica (e altro).
Ho visto come si comportano linguaggi di programmazione e tools on- e offline.
Questo è l’elenco dei post:

Per quanto mi riguarda potrebbero aggiungersi elementi solo se arrivano contributi tramite commenti (sui poi, su Facebook, su Twitter, su G+, via mail, snailmail, telefono, piccioni viaggiatori, ___________). Se invede di un commento arriva una bozza di un post (a n1n0 [dot] aegis [at] gmail [dot] com) lo impagino e posto. Se invece è un post su un altro blog o social-coso lo cito qui in fondo come aggiornamento. Da colloqui informali potrebbe essercene uno, prossimamente😉

Per intanto –prima di subito– ne ho due da segnalare.

Potenza di potenza: commento sprint di Gianluigi Filippelli (rockz! assay) che vede l’espressione in modo completamente e interamente differente, incompatibile con la Wiki & me (io): qua davvero ci vorrebbe un set di mate.

Roberto Zanasi consiglia Haskell, ecco un link per provarlo online: Try Haskell! An interactive tutorial in your browser.

Ottimo😀 Attualmente sono ale prese con due linguaggi, uno pratico (Octave) e uno molto meno anche se… (SICP con Racket). Quasi promesso che alla fine di uno dei due Haskell sarà candidato. Probabilmente. Forse😳
Ah! c’è anche un’evoluzione di Python, Coconut. Chissà😳

OK, qui in fondo c’è un sacco di spazio per gli aggiornamenti (quasi-cit.).
Ah! ‘na cosa’ncora: l’immagne lassù viene da un tweet über-fondamentale😀


Calcoli aritmetici – come li fanno

canContinuo con il confronto su come calcoli semplici vengono svolti da tools e linguaggi di programmazione diversi. È la continuazione di questo post, anche se credo possa essere visto anche autonomamente.

Per prima cosa un comportamento che vedo usato da chi ha una scolarità bassa o che opera in particolari attività: usano la calcolarice normale.
La calcolatrice normale è quella che costa pochissimo e risponde subito, quella che piace a Epimeteo.
Un esempio: l’espressione 1 + 2 * 3 ha come risultato 9 e non 7 come si usa a scuola (prima media, probabilmente). Questo perché alla pressione del tasto * viene visualizzata l’espressione sospesa (1 + 2) e sul display compare il risultato corrente, 3. Gli utenti normali considerano corretto questo comportamento, non eseguono mai espressioni composte, con un’eccezione la catena di somme.
Una ditta locale ha vietato tutte le operazioni tranne la somma sul quaderno in cui registra le quantità in arrivo (no, non posso mettere l’immagine). Siccome i soci non si fidano troppo gli uni con gli altri verificano ognuno per conto loro le somme. Le due addette alla compilazione del quaderno (lavorano part-time) sono –immaginate voi😉

È un caso estremo ma la calcolatrice normale c’è e si usa quella. Ha due vantaggi: per il produttore è semplice da costruire, per l’utente è facile da usare.
Non è che il calcolo da sinistra dell’espressione 2^2^2^2^0 che ha dato il via a questa telelenovela ha un’origine simile? Si parla del Basic dell’epoca in cui sono comparsi i primi personal computer, la memoria era quella che era… Vedi il commento al post di Roberto Zanasi di Luca Pellacani, condivido (quasi interamente anche se sono meno estremista).
Poi essendo gli utenti abituati al modo usato dal Basic questo è stato adottato dai fogli di calcolo (supposizione mia, la Wiki metterebbe qui un citation needed) e ad altri linguaggi (MatLab e Octave).

Ho inoltre visto –qui in locale, non so quanto possa essere valido o ha solo valenza aneddotica– che gli studenti delle superiori con orientamento letterario non sanno (o non si curano) di fare calcoli semplicissimi; vengono messi in difficoltà da equazioni di primo grado, il famoso

un mattone pesa un kilo e mezzo mattone
quanto pesa il mattone?

Fine della premessa il post vuol’essere con confronto tra tools diversi per due casi semplici: -3^2 e 0^0.
IEEE 754 prescrive per i linguaggi 0^0 = 1.

-3^2 = -(3^2) = -9
0^0 = 1

-3^2 = -9
0^0 = Indeterminate

-3^2 = -9
0^0 = (undefined)


Foglio di calcolo (Calc di Libre Office)








Discussione: Ok, panico!😳

Ordine di valutazione degli operatori aritmetici

sg1Un po’ di materiale prima di continuare con argomenti simili a quello  dell’elevazione a potenza innescato da Roberto Zanasi. Finora ho pubblicato due post, qui e qui.

Io sono niubbassay, per fortuna il Web ha spesso la risposta alle domande prima ancora che queste vengano poste. Per esempio la Wiki😀 per l’ordine di valutazione degli operatori aritmetici ha una pagina molto dettagliata in inglese: Order of operations.
La versione in lingua italiana è molto più sintetica ma c’è tutto l’essenziale: Ordine delle operazioni.
Numerosi link rinvino ad approfondimenti e argomenti collegati. Ottimo davvero😀
Ci sono situazioni ambigue, per esempio i fisici (anche Feynman!) alle volte si discostano dai matematici. Un caso è raccontato qui.

Per quanto mi riguarda, in particolare per i linguaggi di programmazione, la soluzione (mia) è di usare le parentesi per risolvere le ambiguità. Anzi, usare le parentesi anche quando non necessarie ma chiarificanti quel che si sta facendo. Poi come già visto precedentemente ogni linguaggio ha le sue abitudini, controllare quando si scrive (molto più facile che fare il debug dopo).
A proposito in qualche punto la wiki (inglese) non usa un linguaggio da programmatori, per Smalltalk ma ci può stare; il senso è chiaro per tutti anche gli umani normali (generici medi)😉
Anche la pagina Exponentiation riporta il caso a^b^c; molto diversa la pagina in italiano.

Tratta anche il caso delle potenze di zero, compreso lo spinoso 0^0. Mi sa che questo caso sarebbe da verificare con i miei usuali linguaggi di programmazione. In questo caso c’è una specifica IEEE: IEEE 754.

Recentissimo un post —Potenza di potenza: commento sprint— di Gianluigi Filippelli (rockz! assay) che vede l’espressione in modo completamente e interamente differente, incompatibile con la Wiki & me (io): qua davvero ci vorrebbe un set di mate.


Elevazione a potenza – come – 2


Continuo da qui con il problema di quanto vale l’espressione 2^2^2^2^0.

Oggi con qualcuno dei linguaggi di programmazione correnti.
Quando ho cominciato a programmare il linguaggio normale era il Fortran. Oggi a usarlo sono davvero molto pochi, anch’io l’ho abbandonato, proprio come il latino. Ma a differenza del latino il Fortran si è evoluto, più volte; eccolo in una versione moderna (quasi, è comunque dello scorso millennio).

Il file del codice è ridotto ai minimi termini, un’istruzione di print su terminale (*), l’espressione, tenendo conto che l’operatore di elevazione a potenza è ** e end per indicare la fine del programma (epz.f95):

print *, 2 ** 2 ** 2 ** 2 ** 0


Successivamente sono comparsi il Basic (per i PC, ci sono gli esempi nel post precedente, quello indicato) e il C. Ecco epz.c:


int main () {
   printf("%lf\n", pow(2, pow(2, pow(2, pow(2, 0)))));


Due note: non c’è un operatore come per Fortran, Basic e altri ma una funzione, pow(), che restituisce un double; si potrebbe fare di meglio, vedi per esempio qui e qui.

Ma credo sia più interessante constatare come l’uso di una funzione obbliga a chiarire il calcolo che si vuole eseguire.

Lo stesso capita con Delphi che non uso da tempo, è solo per Windows; sembra inoltre in declino come linguaggio; ecco il codice, fornito dall’amico Walter:

program Project3;


{$R *.res}

  System.SysUtils, system.math;

  res: single;
  a: char;

    { TODO -oUser -cConsole Main : Insert code here }
    res := power(power(power(power(2, 2), 2), 2), 0);
    writeln('2^2^2^2^0 = ', res:5:3);
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);

No, niente screenshot ma è chiaro che usando la funzione power siamo nella stessa condizione del C. Notare l’abitudine windoziana di bloccare la terminazione del programma sino alla pressione di Invio, loro sono poco usi al terminale (che chiamano Prompt dei comandi).
Nota: Walter (rockz!) è da sempre multi-OS e si adegua (anche inconsciamente)😀

A questo punto scommetto che i miei 12 lettori si aspettano Java, attualmente usatissimo. Ma sarebbe una ripetizione dei casi precedenti, la funzione da usare è Math.pow(). E anche JavaScript, stessa roba.

Piuttosto Python, il Basic di adesso; anche qui possiamo usarlo in modo interattivo, è un caso monolinea:


Una sola –importantissima– nota: l’operatore elevazione a potenza è ** e non ^ che è l’XOR binario.
Esiste inoltre la funzione pow(), proprio (quasi) come quella del C:


Quale usare è questione di preferenza personale (tornerò sull’argomento).

In certi ambienti, per elaborazioni particolari vengono usati linguaggi specifici, orientati al problema. Uno di questi è MatLab, costoso, spesso basta Octave, il suo clone FOSS che ho appena iniziato a raccontare sul blog. Octave permette di usare come operatore sia ^ che **:


OOPS! come il Basic, a differenza di tutti gli altri linguaggi finora esaminati. C’è anche la funzione power():


Ecco, questo è il punto a cui volevo arrivare. L’uso di una funzione che ritorna un valore che può essere passato eventualmente a un’altra funzione risolve le ambiguità dell’espressione aritmetica.

Proprio come capita nel Lisp dove non esistono operatori ma solo procedure (così vengono chiamate le funzioni, almeno in Scheme, una delle ultime evoluzioni). Inoltre l’uso delle parentesi a formare delle forms elimina ogni ambiguità; pensa che bello, non esistono regole di precedenza tra gli operatori (che non ci sono) da memorizzare; la form viene valutata in base al primo elemento della lista a cui si applicano gli altri elementi come dati (OK, esistono alcuni casi speciali, ma il concetto è quello). Ecco, con Racket ho


A questo punto un dubbio: Smalltalk lo metto o no? Lì tutto viene visto come un oggetto o un messaggio da applicare all’oggetto. Non valgono le regole usuali e la codifica ne risente.
Ma si usa? serve? interessa?

Siccome ho saltato parecchi linguaggi (oltre ai citati Java e JavaScript) ci sono Ruby, Rust, Haskell, Go, you name it. Ho contatti che li usano e ne usano altri ancora. Se commentano (qui o sui social-cosi) e ci sarà materiale potrebbe esserci un post ulteriore. Con Smalltalk (gst) se del caso. Io sono vincolato a Linux ma non sono razzista: ho parecchi amici con Windows e qualcuno finanche con il Mac. E anche peggio😉

Mi accorgo che mi manca una cultura matematica per giustificare bene perché l’espressione di Zar si deve valutare da destra (come sono fermamente convinto e so di essere in buona compagnia). Chissà se c’è qualche matematto a Berlino qui intorno?😉


SICP – cap. 1 – Esempio: test di primalità – 27

l_linuxContinuo con la primalità, oggi i metodi probabilistici, qui.

Metodi probabilistici
The Fermat test differs in character from most familiar algorithms, in which one computes an answer that is guaranteed to be correct. Here, the answer obtained is only probably correct. More precisely, if n ever fails the Fermat test, we can be certain that n is not prime. But the fact that n passes the test, while an extremely strong indication, is still not a guarantee that n is prime. What we would like to say is that for any number n, if we perform the test enough times and find that n always passes the test, then the probability of error in our primality test can be made as small as we like.

Unfortunately, this assertion is not quite correct. There do exist numbers that fool the Fermat test: numbers n that are not prime and yet have the property that an is congruent to a modulo n for all integers a < n. Such numbers are extremely rare, so the Fermat test is quite reliable in practice. [vedi numeri di Carmichael, qui sotto] There are variations of the Fermat test that cannot be fooled. In these tests, as with the Fermat method, one tests the primality of an integer n by choosing a random integer a < n and checking some condition that depends upon n and a. (See exercise 1.28 [prossimamente] for an example of such a test.) On the other hand, in contrast to the Fermat test, one can prove that, for any n, the condition does not hold for most of the integers a < n unless n is prime. Thus, if n passes the test for some random choice of a, the chances are better than even that n is prime. If n passes the test for two random choices of a, the chances are better than 3 out of 4 that n is prime. By running the test with more and more randomly chosen values of a we can make the probability of error as small as we like.

The existence of tests for which one can prove that the chance of error becomes arbitrarily small has sparked interest in algorithms of this type, which have come to be known as probabilistic algorithms. There is a great deal of research activity in this area, and probabilistic algorithms have been fruitfully applied to many fields. Ovviamente la crittografia.

Numeri di Carmichael
Questo è il testo della nota 47 del cap. corrente del SICP, mooolto interessante per diversi motivi (anche mate vs. ing).

Numbers that fool the Fermat test are called Carmichael numbers, and little is known about them other than that they are extremely rare. There are 255 Carmichael numbers below 100,000,000. The smallest few are 561, 1105, 1729, 2465, 2821, and 6601. In testing primality of very large numbers chosen at random, the chance of stumbling upon a value that fools the Fermat test is less than the chance that cosmic radiation will cause the computer to make an error in carrying out a “correct” algorithm. Considering an algorithm to be inadequate for the first reason but not for the second illustrates the difference between mathematics and engineering.

Intanto sappiamo che


ma succede che il test ci dice


anche se, ovviamente (mi ripeto)


OK😀 ci aspettano una serie di esercizi per finire il capitolo; prossimamente😀



Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Segui assieme ad altri 93 follower