In quanti modi riusciamo a scrivere il crivello di Eratostene?
Gianluca Moro
giangiammy@gmail.com
Lun 1 Nov 2010 18:27:22 CET
ciao,
$ cat eratostene4.scm
;
; Crivello di Eratostene - by giammy - www.giammy.com - giangiammy@gmail.com
; Crivello di eratostene:
;
; L'idea base e' implementata nella funzione genera-successivo e ciclo.
;
; Essenzialmente, posso implementare una pipe line di processi, del tipo
;
; Processo 1: produci il numero successivo (n->n+1)
; Processo 2: prendi il numero prodotto da processo 1, se e' multiplo di 2
; eliminalo, altrimenti e' il prossimo numero primo
; Processo 3: prendi il numero prodotto da processo 2, se e' multiplo di 3
; eliminalo, altrimenti e' il prossimo numero primo
;
; Il trucco sta nel fatto che ogni volta che trovo un numero primo,
; devo allungare la pipe di un processo.
; Questo viene fatto nella funzione ciclo
; ...
; (ciclo (lambda (n) (genera-successivo indice succ n)) (succ indice))))
; ...
; in cui ciclo viene chiamata ricorsivamente, aggiornando la funzione
; genera-successivo.
;
; Test RUN:
;
;bash-3.2$ scheme -load eratostene4.scm
;MIT/GNU Scheme running under MacOSX
;Type `^C' (control-C) followed by `H' to obtain information about interrupts.
;
;Copyright (C) 2010 Massachusetts Institute of Technology
;This is free software; see the source for copying conditions. There is NO
;warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
;
;Image saved on Thursday October 28, 2010 at 12:06:49 PM
; Release 9.0.1 || Microcode 15.1 || Runtime 15.7 || SF 4.41 || LIAR/C 4.118
; Edwin 3.116
;
;2
;3
;5
;7
;11
;13
;17
;19
;23
;29
;31
;37
;41
;43
;47
;53
;59
;61
;67
;71
;73
;79
;83
;89
;97
;101
;103
;107
;109
;113
;127
; ... e via cosi' ...
;
; x e' multiplo di n? ritorna vero o falso
;
(define (multiplo-di? n x)
(= (* (floor (/ x n)) n) x)
)
;
; successivo: genera il numero naturale successivo
;
(define (successivo n)
(+ n 1))
;
; prende il prossimo numero non multiplo di base prodotto dal
; precedente generatore
;
(define (genera-successivo base succ indice)
(let ((prossimo-indice (succ indice)))
(if (multiplo-di? base prossimo-indice)
(genera-successivo base succ prossimo-indice)
prossimo-indice)))
;
; ciclo principale
;
(define (ciclo succ indice)
(begin
(display indice)
(newline)
(ciclo (lambda (n) (genera-successivo indice succ n)) (succ indice))))
;
; per lanciare il crivello (ATTENZIONE: IL PROGRAMMA NON TERMINA!)
;
(ciclo successivo 2)
--
Gianluca Moro --- Enjoy CloudUSB: http://www.cloudusb.net/
http://www.giammy.com --- http://www.math.unipd.it/~giammy/
Diaspora Forum: http://diasporadoc.info/forum/
Just remember, there's a right way and a wrong way to do everything
and the wrong way is to keep trying to make everybody else do it the
right way
Maggiori informazioni sulla lista
blug