Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7980[/thread]

Primzahlen finden: wie würdet ihr es machen ?

Leser: 2


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
Matze
 2006-05-15 14:13
#66101 #66101
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich hatte mal nichts zu tun und habe ausprobiert einen Primzahlen-
Generator zu programmieren.
Erst habe ich in der Forum-Suche nachgesehen, ob das Thema schon
mal behandelt wurde, aber es gab keine interessanten Ergebnisse.

Ich habe es dann mal so realisiert:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/perl -w
#
use strict;

my $bis = $ARGV[0];
if (! defined($bis) || $bis < 2) {
  print "'$bis' ist keine korrekte Angabe.\nUSAGE: find_prim.pl 2+";
  exit
}

my @prim = (2);

L:for (my$az = 3;$az <= $bis;$az += 2) {
  foreach (@prim) {
    if ($_ > $az/2) { last }
    if ($az % $_ == 0) {
      next L;
    }
  }
  push(@prim,$az);
}

print "Primzahlen gefunden!\n";
print "Ausgeben ?[j/n]  ";
chomp(my$i = <STDIN>);

if (lc($i) eq "j") {
  $" = "\t";
  print "@prim";
}

1
(Primzahlen bis 100000 in 19 sek.)
würde aber gerne wissen wie ihr es machen würdet.

MfG. Matze
Mit freundlichen Grüßen: Matze
GwenDragon
 2006-05-15 14:25
#66102 #66102
User since
2005-01-17
14757 Artikel
Admin1
[Homepage]
user image
Teutales
 2006-05-15 14:43
#66103 #66103
User since
2006-03-21
47 Artikel
BenutzerIn
[default_avatar]
Was du benutzt ist die "Standard"-Methode, würd ich sagen... Für die Primzahlberechnung gibt es des weiteren verschiedene Verfahren, die auch rel. einfach zu implementieren sind. U.a. das "Sieb des Eratosthenes", der Miller-Rabin-Test, etc. Such einfach mal bei Wikipedia oder so...
Grüße Teutales
Matze
 2006-05-15 14:47
#66104 #66104
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn ich mich nicht irre Legt Crypt-Primes doch nur die Primzahlen,
von 2..70000(ungefähr) fest und berechnet/bestimmt die Primzahlen
nicht, oder ? ???

MfG. Matze
Mit freundlichen Grüßen: Matze
Dubu
 2006-05-15 14:52
#66105 #66105
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Nur der Unübersichtlichkeit halber (courtesy of Abigail):
Code: (dl )
perl -le '$_=1;(1x$_)!~/^(11+)\1+$/&&print while++$_'
Taulmarill
 2006-05-15 16:26
#66106 #66106
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
der regex wird natürlich für grössere zahlen übelst langsam, dafür kann er aber auch jede zahl testen, ohne die vorherigen primzahlen zu finden. bei dem ansatz von matze würde ich das modulo nur bis zur quadratwurzel der zu prüfenden zahl testen, das spart noch einmal einiges an rechenzeit:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use strict;

my $max = $ARGV[0] || 100;
my @primes = ( 2 );
for my $num ( 3 .. $max ) {
my $sqrt = sqrt $num;
for my $prime ( @primes ) {
last unless $num % $prime;
push @primes, $num and last if $prime > $sqrt;
}
}

print join ", ", @primes;
print "\n";
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
lichtkind
 2006-05-15 16:29
#66107 #66107
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
schnellst methode primzahlen zu sieben ist das sieb des eresthotenes:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use strict;

my $max = 100; # obergrenze bis wohin wir berechnen
my @sieb=(0..$max); # sieb des erestothenes

for my $i (2..($max/2)){
next unless $sieb[$i];
$sieb[$i*$_] = 0 for 2..int $max/$i;
}

# ausgabe
for my $i (2..$max) { print "$sieb[$i] " if $sieb[$i] }


bei sher grossen zahlen vielleicht besser


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use strict;

my $max = 100; # obergrenze bis wohin wir berechnen
my @sieb = $max; # sieb des erestothenes

for my $i (2..($max/2)){
next if $sieb[$i];
$sieb[$i*$_] = 1 for 2..int $max/$i;
}

# ausgabe
for my $i (2..$max) { print "$i " unless $sieb[$i] }
\n\n

<!--EDIT|lichtkind|1147696965-->
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Taulmarill
 2006-05-15 16:57
#66108 #66108
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wobei es auch bei dem sieb reichen sollte, bis sqrt $max und nicht bis $max/2 zu gehen. zur ausgabe würde ich folgendes vorschlagen
Code: (dl )
print join ", ", grep $_, @sieb;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Matze
 2006-05-15 17:38
#66109 #66109
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke für die vielen Anregungen!

@lichtkind: Was bedeutet @sieb = $max ?
Werden dann $max Elemente in @sieb auf undef gesetzt ?

MfG. Matze
Mit freundlichen Grüßen: Matze
Taulmarill
 2006-05-15 17:45
#66110 #66110
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
[quote=Matze,15.05.2006, 15:38]@lichtkind: Was bedeutet @sieb = $max ?
Werden dann $max Elemente in @sieb auf undef gesetzt?[/quote]
so ähnlich. normalerweise wird ein array oder hash immer wieder dynamisch erweitert, wenn ihm werte zugewiesen werden. mit der angabe kann man den array in einem schritt auf eine gewisse grösse bringen.

bei 100 elementen ist das noch nicht so wichtig, aber bei sehr vielen elementen kann das ein bischen rechenzeit sparen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2006-05-15 14:13.