{
Copyright (C) 2020 I. Kakoulidis, <ioulianos.kakoulidis@hotmail.com>
https://g...content-available-to-author-only...b.com/JulStrat/primesieve-pas
This file is distributed under the BSD 2-Clause License.
}
program hprimes;
{$IF Defined(FPC)}{$MODE Delphi}{$ASMMODE Intel}{$ENDIF}
function MulModASM(a, b: UInt64; m: UInt64): UInt64;
label
MUL_MOD;
asm
MOV RCX, m
MOV RAX, a
CMP RAX, RCX
JB MUL_MOD
XOR RDX, RDX
DIV RCX
MOV RAX, RDX
MUL_MOD:
MUL b
DIV RCX
MOV @Result, RDX
end;
function PowMod(b, e: UInt64; m: UInt64): UInt64;
begin
if b >= m then b := b mod m;
Result := 1;
while e <> 0 do
begin
if (e and 1) = 1 then Result := MulModASM(Result, b, m);
e := e shr 1;
b := MulModASM(b, b, m);
end;
end;
function MillerRabin(n: UInt64): boolean;
var
a, d, x: UInt64;
i, r: integer;
witness: boolean;
begin
case n of
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37: Exit(True);
end;
if ((n and 1) = 0) or (n = 1) then Exit(False);
d := n - 1;
r := 0;
while (d and 1) = 0 do
begin
Inc(r);
d := d shr 1;
end;
for a in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37] do
begin
x := PowMod(a, d, n);
if (x = 1) or (x = n - 1) then continue;
witness := false;
for i := 1 to r - 1 do
begin
x := MulModASM(x, x, n);
if x = n - 1 then
begin
witness := true;
break;
end;
end;
if witness = false then Exit(false);
end;
Result := true;
end;
var
m: UInt64;
c: integer;
begin
m := $FFFFFFFFFFFFFFFF;
c := 0;
while c < 10 do
begin
if MillerRabin(m) then
begin
WriteLn(($FFFFFFFFFFFFFFFF - m) + 1);
Inc(c);
end;
m := m - 1;
end;
end.
ewogIENvcHlyaWdodCAoQykgMjAyMCBJLiBLYWtvdWxpZGlzLCA8aW91bGlhbm9zLmtha291bGlkaXNAaG90bWFpbC5jb20+CiAgaHR0cHM6Ly9nLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5iLmNvbS9KdWxTdHJhdC9wcmltZXNpZXZlLXBhcwoKICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlLgp9Cgpwcm9ncmFtIGhwcmltZXM7CnskSUYgRGVmaW5lZChGUEMpfXskTU9ERSBEZWxwaGl9eyRBU01NT0RFIEludGVsfXskRU5ESUZ9CgpmdW5jdGlvbiBNdWxNb2RBU00oYSwgYjogVUludDY0OyBtOiBVSW50NjQpOiBVSW50NjQ7CmxhYmVsCiAgTVVMX01PRDsKCmFzbQogIE1PViBSQ1gsIG0KICBNT1YgUkFYLCBhCiAgQ01QIFJBWCwgUkNYCiAgSkIgTVVMX01PRAogIFhPUiBSRFgsIFJEWAogIERJViBSQ1gKICBNT1YgUkFYLCBSRFgKCk1VTF9NT0Q6CiAgTVVMIGIKICBESVYgUkNYCiAgTU9WIEBSZXN1bHQsIFJEWAplbmQ7CgpmdW5jdGlvbiBQb3dNb2QoYiwgZTogVUludDY0OyBtOiBVSW50NjQpOiBVSW50NjQ7CmJlZ2luCiAgaWYgYiA+PSBtIHRoZW4gYiA6PSBiIG1vZCBtOwogIFJlc3VsdCA6PSAxOwoKICB3aGlsZSBlIDw+IDAgZG8KICBiZWdpbgogICAgaWYgKGUgYW5kIDEpID0gMSB0aGVuIFJlc3VsdCA6PSBNdWxNb2RBU00oUmVzdWx0LCBiLCBtKTsKICAgIGUgOj0gZSBzaHIgMTsKICAgIGIgOj0gTXVsTW9kQVNNKGIsIGIsIG0pOwogIGVuZDsKZW5kOwoKZnVuY3Rpb24gTWlsbGVyUmFiaW4objogVUludDY0KTogYm9vbGVhbjsKdmFyCiAgYSwgZCwgeDogVUludDY0OwogIGksIHI6IGludGVnZXI7CiAgd2l0bmVzczogYm9vbGVhbjsKCmJlZ2luCiAgY2FzZSBuIG9mCiAgICAyLCAzLCA1LCA3LCAxMSwgMTMsIDE3LCAxOSwgMjMsIDI5LCAzMSwgMzc6IEV4aXQoVHJ1ZSk7CiAgZW5kOwogIGlmICgobiBhbmQgMSkgPSAwKSBvciAobiA9IDEpIHRoZW4gRXhpdChGYWxzZSk7CiAgZCA6PSBuIC0gMTsKICByIDo9IDA7CgogIHdoaWxlIChkIGFuZCAxKSA9IDAgZG8KICBiZWdpbgogICAgSW5jKHIpOwogICAgZCA6PSBkIHNociAxOwogIGVuZDsKCiAgZm9yIGEgaW4gWzIsIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjksIDMxLCAzN10gZG8KICBiZWdpbgogICAgeCA6PSBQb3dNb2QoYSwgZCwgbik7CiAgICBpZiAoeCA9IDEpIG9yICh4ID0gbiAtIDEpIHRoZW4gY29udGludWU7CiAgICB3aXRuZXNzIDo9IGZhbHNlOwoKICAgIGZvciBpIDo9IDEgdG8gciAtIDEgZG8KICAgIGJlZ2luCiAgICAgIHggOj0gTXVsTW9kQVNNKHgsIHgsIG4pOwogICAgICBpZiB4ID0gbiAtIDEgdGhlbgogICAgICBiZWdpbgogICAgICAgIHdpdG5lc3MgOj0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgZW5kOwogICAgZW5kOwoKICAgIGlmIHdpdG5lc3MgPSBmYWxzZSB0aGVuIEV4aXQoZmFsc2UpOwogIGVuZDsKICBSZXN1bHQgOj0gdHJ1ZTsKZW5kOwoKdmFyCiAgbTogVUludDY0OwogIGM6IGludGVnZXI7CgpiZWdpbgogIG0gOj0gJEZGRkZGRkZGRkZGRkZGRkY7CiAgYyA6PSAwOwoKICB3aGlsZSBjIDwgMTAgZG8KICBiZWdpbgogICAgaWYgTWlsbGVyUmFiaW4obSkgdGhlbgogICAgYmVnaW4KICAgICAgV3JpdGVMbigoJEZGRkZGRkZGRkZGRkZGRkYgLSBtKSArIDEpOwogICAgICBJbmMoYyk7CiAgICBlbmQ7CiAgICBtIDo9IG0gLSAxOwogIGVuZDsKCmVuZC4=