Παρασκευή, 26 Μαρτίου 2010

Οι πρώτοι 100 [πρώτοι αριθμοί]

Πρώτος, καλείται ένας φυσικός μεγαλύτερος του 1, που διαιρείται ακριβώς μόνο με την μονάδα και τον εαυτό του. Θα γνωρίζετε, υποθέτω, την μέθοδο εντοπισμού τους από τον Ερατοσθένη - το κόσκινο του Ερατοσθένη.

Παραδείγματα πρώτων αριθμών : 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41 ...

Ο αριθμός 2 είναι ο μόνος άρτιος (ζυγός) πρώτος αριθμός. Οι υπόλοιποι πρώτοι αριθμοί είναι περιττοί (μονοί).

Θέλουμε να φτιάξουμε ένα πρόγραμμα που θα υπολογίζει τους πρώτους 100 πρώτους αριθμούς. Ο έλεγχος για το αν κάποιος αριθμός είναι πρώτος θα γίνεται με μια λογική συνάρτηση.

Μέσα στην συνάρτηση θα προσπαθούμε να βρούμε αν ο δοθείς αριθμός Ξ διαιρείται με διαδοχικούς περιττούς αριθμούς, από 3 μέχρι Τετραγωνική_Ρίζα(Ξ). Δεν υπάρχει λόγος να ψάξουμε για μεγαλύτερους διαιρέτες, γιατί θα τους έχουμε ήδη συναντήσει ως πηλίκα, και θα έχουμε μάθει αν ο αριθμός Ξ διαιρείται.

Παραδείγματα :

16=2*8=4*4=8*2. Δεν ψάχνουμε για διαιρέτη πέρα από το 4.

60=2*30=3*20=4*15=5*12=6*10=10*6=12*5=15*4=20*3=30*2. Δεν ψάχνουμε για διαιρέτη πέρα από το Τ_Ρ(64)=7 κόμμα κάτι.

Η δική μου πρόταση φαίνεται παρακάτω. (Συμβουλή για ερευνητές : Αν η ταχύτητα υπολογισμού είναι σημαντική, για πολύ μεγάλα Ξ, δεν διαιρούμε με περιττούς από 3 μέχρι την ρίζα Ξ, αλλά διαιρούμε με πρώτους μέχρι την ρίζα Ξ).

ΠΡΟΓΡΑΜΜΑ πρωτοι
! πρώτος καλείται ο φυσικός αριθμός που διαιρείται ακριβώς
! μόνο με την μονάδα και τον εαυτό του.
! Εδώ θα βρούμε και θα γράψουμε τους πρώτους 100 πρώτους αριθμούς
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: ΠΡ[100], i, imax, Ξ
ΑΡΧΗ
imax <- 100
ΠΡ[1] <- 2
i <- 1 ! το i μετράει πόσους πρώτους έχουμε βρεί
Ξ <- 3 ! ελέγχουμε μόνο τους περιττούς από το 3 και μετά
ΟΣΟ i < imax ΕΠΑΝΑΛΑΒΕ
ΑΝ einaiprotos(Ξ) ΤΟΤΕ
i <- i + 1
ΠΡ[i] <- Ξ
ΤΕΛΟΣ_ΑΝ
Ξ <- Ξ + 2
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ imax ΜΕ_ΒΗΜΑ 10
ΓΡΑΨΕ ΠΡ[i], ΠΡ[i + 1], ΠΡ[i + 2], ΠΡ[i + 3], ΠΡ[i + 4], ΠΡ[i + 5], ΠΡ[i + 6], ΠΡ[i + 7], ΠΡ[i + 8], ΠΡ[i + 9]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
!
ΣΥΝΑΡΤΗΣΗ einaiprotos(Ξ): ΛΟΓΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Ξ, Σ
ΠΡΑΓΜΑΤΙΚΕΣ: ΡΙΖΑΞ
ΛΟΓΙΚΕΣ: διαιρείται
ΑΡΧΗ
ΡΙΖΑΞ <- Α_Μ(Τ_Ρ(Ξ))
Σ <- 3 ! οι διαιρέτες θα είναι περιττοί, από το 3 και μετά
διαιρείται <- ΨΕΥΔΗΣ
ΟΣΟ (Σ <= ΡΙΖΑΞ) ΚΑΙ (διαιρείται = ΨΕΥΔΗΣ) ΕΠΑΝΑΛΑΒΕ
ΑΝ Ξ MOD Σ = 0 ΤΟΤΕ
διαιρείται <- ΑΛΗΘΗΣ
ΤΕΛΟΣ_ΑΝ
Σ <- Σ + 2
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
einaiprotos <- ΑΛΗΘΗΣ
ΑΝ διαιρείται ΤΟΤΕ
einaiprotos <- ΨΕΥΔΗΣ
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


Το εξαγόμενο είναι το ακόλουθο :
  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 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349
353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541

Δεν υπάρχουν σχόλια: