Schrift
[thread]6228[/thread]

Factorize that number to primes



<< >> 9 Einträge, 1 Seite
data
 2004-05-03 21:01
#81959 #81959
User since
2003-08-26
10 Artikel
BenutzerIn
[default_avatar]
hallo,

wie kann ich dies (siehe betreffzeile)am besten mittels perl anstellen:

z.b. 24 = 12 x 2 = 6 x 2 x 2 = 3 x 2 x 2 x 2 -> 3+2+2+2 = 9
als ergebnis muß 9 rauskommen, bekannt ist nur die eingabe = 24

anderes beispiel: input 13289 output muss 234 ergeben

bei mir heut nur noch putput :-(, kann mir diesbezüglich jemand auf die sprünge helfen?

cu...
daniel
[E|B]
 2004-05-03 21:07
#81960 #81960
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
HiHo!

Code: (dl )
1
2
3
4
5
use strict;
use warnings;
use Math::Factor;

$factor = factor("24");


"$faktor" ist dann eine Referenz auf deine Zahl.


btw: Bist du der data von perl.de?
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
lichtkind
 2004-05-03 21:16
#81961 #81961
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
ich hab mal sowas selbst geschrieben
geht mit ganz wenig und auch ganz schnell
grad bei grossen zahlen lohnt sich erestotenes
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
[E|B]
 2004-05-03 21:57
#81962 #81962
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ich kenn nur Eratosthenes. ;)
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
data
 2004-05-03 22:01
#81963 #81963
User since
2003-08-26
10 Artikel
BenutzerIn
[default_avatar]
hallo E|B,

ja bin ich. war schon lange nicht mehr hier ... und doch wieder gefunden ;-)
kannst mich ja mal per icq ansprechen, mit der funktion klappt was nicht.


cu...
daniel

ps: 76525513 icq, falls du sie nicht haben solltest
Ishka
 2004-05-03 22:33
#81964 #81964
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Willkommen zurück.

Das hängt natürlich davon ab, wie groß deine Zahlen sind. Für kleine Zahlen geht das recht schnell:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
my $zahl=24;
my $erg=0;
my @prim=(2,3,5,7,11,13);
for(@prim){
unless($zahl % $_){
$zahl/=$_;
$erg+=$_;
redo}
}
if($zahl>1){print "mach die Primzahlenliste größer\n"}


Wenn du das bei größeren Zahlen haben willst, solltest du dir noch ne Funktion schreiben, die zur Laufzeit die Liste verlängert.

Für genügend große Zahlen dauert das allerdings ewig. Und wenn du nen Algo findest, der das schnell kann auch für große Zahlen, biste reich..
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
[E|B]
 2004-05-03 22:57
#81965 #81965
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@data

Was sagte ich, Ishka wird da schnell was herzaubern. ;)



Greetz to Ishka :D
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
esskar
 2004-05-03 23:05
#81966 #81966
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
@E|B: Deine Funktion ist nicht die richtige!

naja, schnell ist anders, aber wenn du die Liste vorberechnen lässt und als Datei einbindest, kann es gehen

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/perl

use strict;
use warnings;

use vars qw/@PRIMES/;

use constant L => 1024;   # 2^10
use constant M => 1048584;   # 2^20 + 8

@PRIMES = sieve();

print "     24 = ", fact(24), "\n";
print "  13289 = ", fact(13289), "\n";
print " 524288 = ", fact(524288), "\n";
print "1048576 = ", fact(1048576), "\n";
print "4194304 = ", fact(4194304), "\n";

sub sieve # Generating array of test primes via sieve of Eratosthenes
{
  # sieve of Eratosthenes

  my @retval = ();
  my @primes = ();
  my ($i, $j) = (0, 0);

  for $i (0 .. M) { $primes[$i] = 1; } # set all as prime

  for $i (1 .. L) # go thru all primes and
  {
     if($primes[$i]) # throw out the multiples
     {
        for($j = 2*$i*($i+1); $j <= M; $j += 2*$i+1) { $primes[$j] = 0; }  # multiples are not prime
     }
  }

  # populate the vector of test divisors

  $i = 0;
  $retval[$i++] = 2; # set the even prime

  for $j (1 .. M)
  {
     $retval[$i++] = 2*$j + 1 if $primes[$j];
  }

  return @retval;
}

sub fact
{
  my ($n) = @_;
  my $retval = 0;

  for (@PRIMES)
  {
     unless($n % $_)
     {
        $n /= $_;
        $retval += $_;
        redo
     }
  }

  print "M to small\n" if $n > 1;

  return $retval;
}


btw. ich hatte die Funktion im Original irgendwann mal in C geschrieben; in C ist sie bei weitem schneller; zum vergleich:

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
int sieve(unsigned long d[])
{
// sieve of Eratosthenes

  unsigned int a, i;                   // loop ind, exponent

  /* the array prime[x] test for primality of 2*x + 1 */
  char prime[M+1];                     // byte array for flags

  for (a = 0; a <= M; a++)             // initialize ...
     prime[a] = 1;                   // ... to everything prime
  for (a = 1; a <= L; a++)             // go thru all primes and
     if (prime[a])                     // throw out the multiples
        for (i = 2*a*(a+1); i <= M; i += 2*a+1)
           prime[i] = 0;              // multiples are not prime

// populate the vector of test divisors

  i = 0;
  d[i++] = 2;                          // set the even prime

  for (a = 1; a<=M; a++)
     if (prime[a])
        d[i++] = 2*a + 1;              // set the uneven primes

  return i;
}
[E|B]
 2004-05-03 23:30
#81967 #81967
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=esskar,03.05.2004, 21:05]@E|B: Deine Funktion ist nicht die richtige![/quote]
Hab ich mittlerweile auch schon gesehen. *gg*
Danke trotzdem für den Hinweis.
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
<< >> 9 Einträge, 1 Seite



View all threads created 2004-05-03 21:01.