Advertisement
deced

Untitled

Oct 26th, 2020
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.30 KB | None | 0 0
  1. uses 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(): Int64;
  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 должно быть положительным числом меньшим 4294967295');
  52.             IsCorrect := false;
  53.         end;
  54.         if ((Ret < 1) or (Ret > 4294967295)) and IsCorrect then
  55.         begin
  56.             Writeln('N должно быть положительным числом меньшим 4294967295');
  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: Integer;
  77.     N: Int64;
  78.     MersennePrime: Int64;
  79. begin
  80.     N := GetN();
  81.     Primes := GetPrimes();
  82.     SetLength(MersennePrimes, Length(Primes));
  83.     for I := 0 to High(MersennePrimes) do
  84.     begin
  85.         MersennePrime := (1 shl Primes[I]) - 1;
  86.         if IsMersennePrime(MersennePrime, Primes[I]) and (MersennePrime < N)
  87.         then
  88.             MersennePrimes[I] := MersennePrime;
  89.     end;
  90.     PrintArray(MersennePrimes);
  91. end;
  92.  
  93. begin
  94.     GetMersennePrimes();
  95.     Readln;
  96.  
  97. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement