bnghtz

iker_primek_keresese_d_tavolsagra.pl

Dec 15th, 2013
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.94 KB | None | 0 0
  1. #! /usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. # PARAMETEREK
  6. # iker primek keresese kovetkezo feltetellel:
  7. # ket prim 'kitevo'-edik hatvanyon levo kulonbseguk d
  8.  
  9. my ($d,$kitevo);
  10. # ($d,$kitevo) = (591629402, 3);
  11. ($d,$kitevo) = (3662738913.0894148423, 2.1);
  12.  
  13. #####################################################################
  14. # primitive primkeresesi algoritmus
  15. sub prime($)
  16. {
  17.   my $number = shift;
  18.   return 1 if ($number == 2);
  19.  
  20.   my $d = 2;
  21.   my $sqrt = sqrt($number);
  22.  
  23.   while (1)
  24.   {
  25.     return 0 if ($number % $d == 0);
  26.  
  27.     if ($d < $sqrt)
  28.     {
  29.       $d++;
  30.     }
  31.     else
  32.     {
  33.       return 1;
  34.     }
  35.   }
  36. }
  37.  
  38. # futo valtozok
  39. my $i = 1;
  40. my ($diff,$prevdiff);
  41. my ($min, $minloc) = ($d, $i);
  42.  
  43. # nagysagrendekre optimalizalt kozelito ertek O = log(n)
  44. # kezdeti nagysagrend:
  45. my $nagysagrend = int(log($d)/log(10)) - 2;
  46. my $seeker = 2 * (10 ** $nagysagrend);
  47. my $itercount = 0;
  48.  
  49. FIRST: while($seeker > 1)
  50. {
  51.   # nagysagrenden beluli kereses
  52.   $diff = $prevdiff = undef;
  53.  
  54.   # legjobb kozelites keresese
  55.   while(!defined($diff) || !defined($prevdiff) || $diff <= $prevdiff )
  56.   {
  57.     $itercount++;
  58.     $i += $seeker;
  59.     $prevdiff = $diff;
  60.     $diff = abs(int($i**$kitevo) - (($i-2)**$kitevo) - $d);
  61.     # legjobb kozelites tarolasa
  62.     if ($min > $diff)
  63.     {
  64.       $min = $diff;
  65.       $minloc = $i;
  66.       last FIRST if $min == 0;
  67.     }
  68.    
  69.     # debug
  70.     # print "i:$i  c:$seeker \t  m: $diff \t  p: $prevdiff\n";
  71.   }
  72.  
  73.   # debug msg
  74.  
  75.   # kovetkezo iteraciohoz korrigalas
  76.   $i -= 2 * $seeker;
  77.   $i = 1 if $i < 0;  
  78.   $seeker /= 10;
  79. }
  80.  
  81. print "iteraciok szama: $itercount\n\n";
  82.  
  83. # eredmeny
  84. my ($p,$q) = ($minloc - 2, $minloc);
  85.  
  86. # szoveges valasz es ellenorzes
  87. print "megtalalt szamok: $p es $q\n";
  88. map {print "$_ " . (prime($_) ? 'prim' : 'nem prim') . "\n";} ($p,$q);
  89. $diff = ($q**$kitevo - $p**$kitevo);
  90. # print "$q^$kitevo - $p^$kitevo = $diff\n";
  91. # print "$diff - $d = ".($diff - $d)."\n";
Advertisement
Add Comment
Please, Sign In to add comment