Advertisement
deced

Untitled

Oct 25th, 2020
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.22 KB | None | 0 0
  1. uses math, SysUtils;
  2.  
  3. type
  4.     IntArray = Array of Int64;
  5.  
  6. function IsMersennePrime(MersennePrime: Int64; Exponent: Integer): Boolean;
  7. var
  8.     IsPrime: Boolean;
  9.     S: Int64;
  10.     I: Integer;
  11. begin
  12.     S := 4;
  13.     IsPrime := false;
  14.     Dec(Exponent);
  15.     for I := 2 to Exponent do
  16.         S := ((S * S) - 2) mod MersennePrime;
  17.     if (S = 0) or (MersennePrime = 3) then
  18.         IsPrime := true;
  19.     IsMersennePrime := IsPrime;
  20. end;
  21.  
  22. function GetPrimes(): IntArray;
  23. Const
  24.     P: Byte = 64;
  25. Var
  26.     Ret: IntArray;
  27.     I, J: Integer;
  28. begin
  29.     SetLength(Ret, P);
  30.     for I := 0 to High(Ret) do
  31.         Ret[I] := I;
  32.     for I := 2 to High(Ret) do
  33.         if (Ret[I] <> 0) then
  34.             for J := I + 1 to High(Ret) do
  35.                 if Ret[J] mod Ret[I] = 0 then
  36.                     Ret[J] := 0;
  37.     GetPrimes := Ret;
  38. end;
  39.  
  40. function GetN(): Integer;
  41. Var
  42.     IsCorrect: Boolean;
  43.     Ret: Int64;
  44. begin
  45.     repeat
  46.         IsCorrect := true;
  47.         Writeln('Введите N');
  48.         try
  49.             Readln(Ret);
  50.         except
  51.             Writeln('N должно быть числом');
  52.             IsCorrect := false;
  53.         end;
  54.         if (Ret < 1) and IsCorrect then
  55.         begin
  56.             Writeln('N должно быть целым числом большим нуля');
  57.             IsCorrect := false;
  58.         end;
  59.     until IsCorrect;
  60.     GetN := Ret;
  61. end;
  62.  
  63. procedure PrintArray(ArrayToPrint: IntArray);
  64. var
  65.     I: Integer;
  66. begin
  67.     Writeln('Числа мерсена равны ');
  68.     for I := 0 to High(ArrayToPrint) do
  69.         if ArrayToPrint[I] <> 0 then
  70.             Writeln(ArrayToPrint[I]);
  71. end;
  72.  
  73. procedure GetMersennePrimes();
  74. var
  75.     MersennePrimes, Primes: IntArray;
  76.     I, N: Integer;
  77.     MersennePrime: Int64;
  78. begin
  79.     N := GetN();
  80.     Primes := GetPrimes();
  81.     SetLength(MersennePrimes, Length(Primes));
  82.     for I := 0 to High(MersennePrimes) do
  83.     begin
  84.         MersennePrime := Round(Power(2, Primes[I]) - 1);
  85.         if IsMersennePrime(MersennePrime, Primes[I]) and (MersennePrime < N)
  86.         then
  87.             MersennePrimes[I] := MersennePrime;
  88.     end;
  89.     PrintArray(MersennePrimes);
  90. end;
  91.  
  92. begin
  93.     GetMersennePrimes();
  94.     Readln;
  95.  
  96. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement