Thank
you.------------------------------------------------------------------发件人:Shlomi
Fish<shlo...@shlomifish.org>日 期:2017年05月04日
03:27:03收件人:derrick<derr...@thecopes.me>抄 送:Jim Gibson<jimsgib...@gmail.com>;
beginners<beginners@perl.org>主 题:Re: prime factorsHi Derrick,
On Wed, 03 May 2017 06:58:44 +0800
"derrick" <derr...@thecopes.me> wrote:
> Thank you for your complete answer. How much memory is used per array element?
>
In Perl, it can be quite a bit because an array contains a vector of pointer to
"SV"s, and each SV may contain an integer, a string, a reference, a floating
point number, etc. There's also the issue of memory fragmentation.
You can mitigate some of that by using
http://perldoc.perl.org/functions/vec.html or something like
https://en.wikipedia.org/wiki/Perl_Data_Language .
> I will work on a shorter algorithm. This one worked on shorter numbers so I
> just used it for this.
>
By shorter do you mean 'faster in runtime speed'? There's also
https://en.wikipedia.org/wiki/Code_golf .
> Derrick
>
>
> ------------------------------------------------------------------发件人:Jim
> Gibson<jimsgib...@gmail.com>日 期:2017年05月03日 00:35:53收件人:derrick
> cope<derr...@thecopes.me>; beginners<beginners@perl.org>主 题:Re: prime
> factors
> > On May 2, 2017, at 7:58 AM, derrick cope <derr...@thecopes.me> wrote:
> >
> > I was writing a program to solve the #3 exercise on project Euler. I needed
> > to find the prime factors of a given number. I have solved it already but a
> > couple of the ways I tried to solve the problem caused a problem.
>
> Exercise #3 is to find the largest prime factor of the number 600,851,475,143.
>
> >
> > The below worked for smaller numbers but when I used the 12 digit number
> > given by project Euler I got "Out of memory!"
> >
> > chomp( my $factor = <>);
> > my @primefactor = grep { &isprime( $_ ) } ( grep { $factor % $_ == 0 }
> > 1..$factor );
>
> Presumably, you have entered the number 600851475143 into the command line
> that executes your program. Therefore, $factor is equal to 600851475143 and
> the expression 1..$factor will be a list of 600851475143 elements; ( 1, 2, 3,
> … , 600851475143 ). You will need a computer with several petabytes of memory
> to store that list.
>
> >
> > sub isprime {
> > my $numb = shift;
> > my @quot = grep {
> > if ( $numb % $_ == 0 ) {1;
> > } else { 0;}
> > } 2..$numb-1;
> > unless ( @quot ) {
> > 1;
> > # say "prime";
> > } else {
> > 0;
> > # say "not prime";
> > }
> > }
>
> This function also generates a very long list of integers (2..$numb-1).
>
> >
> >
> > This one worked but caused my computer to crash.
> >
> > my $xxx = 1;
> > while ( $xxx < $factor ) {
> > if ( $factor % $xxx == 0 and &isprime($xxx) ) {
> > say $xxx;
> > }
> > $xxx++
> > }
> >
> > what is causing perl to do this? Would using a module save memory?
> > Thanks for any help.
>
> Using a module would not save significant memory. You need to devise an
> algorithm that does not require long lists of numbers. You need to test each
> potential prime factor one at a time. You will also need to address the fact
> that Perl’s integers cannot represent the number 600851475143 in their normal
> 32- or 64-bit formats. See ‘perldoc bignum’.
>
> Also note that the smallest factor of any number cannot be larger than the
> square root of that number, so the function isprime need not consider
> potential factors larger than the square root of its argument.
>
>
>
>
> Jim Gibson
>
>
--
-----------------------------------------------------------------
Shlomi Fish http://www.shlomifish.org/
http://www.shlomifish.org/humour/Summerschool-at-the-NSA/
Buffy will always find a wooden stake to slay vampires, even if it means
she will have travelled 100 years back in time, to plant a tree nearby.
— http://www.shlomifish.org/humour/bits/facts/Buffy/
Please reply to list if it's a mailing list post - http://shlom.in/reply .