procedure TForm1.Button1Click(Sender: TObject);
function IstPrime(N: Cardinal): Boolean;
const
MaxPrime = 137;
MaxTrial = MaxPrime * MaxPrime; // maximal trial div bounds
MinPrime = 137; // trial div bounds if N >= MaxTrial, must be <= MaxPrime
Primes: array[0..31] of Byte =
( 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137);
InvPrimes: array[0..31] of Cardinal = // InvPrimes[i] = Primes[i]^-1 mod 2^32
($AAAAAAAB,$CCCCCCCD,$B6DB6DB7,$BA2E8BA3,$C4EC4EC5,$F0F0F0F1,$286BCA1B,$E9BD37A7,
$4F72C235,$BDEF7BDF,$914C1BAD,$C18F9C19,$2FA0BE83,$677D46CF,$8C13521D,$A08AD8F3,
$C10C9715,$07A44C6B,$E327A977,$C7E3F1F9,$613716AF,$2B2E43DB,$FA3F47E9,$5F02A3A1,
$7C32B16D,$D3431B57,$8D28AC43,$DA6C0965,$0FDBC091,$EFDFBF7F,$C9484E2B,$077975B9);
asm
TEST AL,1
JZ @@0 // even ??
CMP EAX,7
JA @@1 // > 7 ??
DEC EAX
SETNZ AL
RET
@@0: CMP EAX,2 // even numbers
SETZ AL
RET
@@1: PUSH EBP // do trial divsion to small primes
PUSH EBX
PUSH ESI
PUSH EDI
MOV EBX,EAX
CMP EAX,MaxTrial
MOV EBP,MinPrime
JAE @@2
PUSH EAX
FILD DWord Ptr [ESP]
FSQRT
FISTP DWord Ptr [ESP]
POP EBP // EBP = Sqrt(N)
@@2: MOV EDI,Offset Primes
MOV ESI,Offset InvPrimes
XOR ECX,ECX
@@3: MOVZX EDX,Byte Ptr [EDI + ECX] // take care, InvPrimes[] MUST
// be after Primes[] declared
MOV EAX,EBX
CMP EDX,EBP
JA @@5
IMUL EAX,[ESI + ECX * 4]
INC ECX
MUL EDX
JC @@3
TEST EDX,EDX
@@4: POP EDI
POP ESI
POP EBX
POP EBP
SETNZ AL
RET
@@5: CMP EBX,MaxTrial // N <= MaxPrime^2 ??
MOV EAX,EBX
JBE @@4
IMUL EAX,EBX // compute domain param U = -N^-1 mod 2^32
SUB EAX,2 // Lookuptable can reduce from 72 donwto 32 cycles
IMUL EAX,EBX
MOV EDX,EAX
IMUL EAX,EBX
ADD EAX,2
IMUL EAX,EDX
MOV EDX,EAX
IMUL EAX,EBX
ADD EAX,2
IMUL EAX,EDX
MOV EBP,EAX
IMUL EBP,EBX
ADD EBP,2
IMUL EBP,EAX // U = -N^-1 mod^2^32 in EBP
MOV EDI,EBX
MOV EAX,EBX
DEC EDI // N -1
NEG EAX
BSF ECX,EDI
MUL EAX
PUSH ECX // bits remain [ESP + 20]
MOV ESI,EAX
BSR ECX,EDI
MOV EAX,EDX
XOR EDX,EDX
NEG ECX
DIV EBX // div, can't be removed
MOV EAX,ESI
ADD ECX,32
DIV EBX // div
SHL EDI,CL
MOV EAX,EDX
IMUL EAX,EBP
MOV ESI,EDX // C = -N^2 mod N, to fast convert into
MUL EBX // montgomery domain
PUSH ESI // C [ESP + 16]
ADD EAX,ESI
ADC EDX,0
PUSH EDX // +1 in montgomery [ESP + 12]
PUSH EDI // bit mask exponent [ESP + 8]
NEG EDX
ADD EDX,EBX
CMP EBX,$08A8D7F // N < $08A8D7F, do SPP to bases 31,73
PUSH EDX // -1 in montgomery [ESP + 4]
JAE @@6
MOV EAX,31
CALL @@9
MOV EAX,73
PUSH Offset @@7
JMP @@9
@@6: MOV EAX,2 // do SPP to bases 2,7,61
CALL @@9
MOV EAX,7
CALL @@9
MOV EAX,61
CALL @@9
@@7: INC EAX
@@8: LEA ESP,[ESP + 4 * 5] // dont change flags !!
JMP @@4
@@9: MUL DWord Ptr [ESP + 16] // convert base in montgomery
MOV EDI,EAX // Base' = Base * C mod N
IMUL EAX,EBP // montgomery REDC
MOV ESI,EDX
MUL EBX
ADD EAX,EDI
ADC EDX,ESI
MOV ECX,[ESP + 8] // bit mask of exponent N -1
MOV EAX,EDX
PUSH EDX
@@A: MUL EAX // X = X^2 mod N
MOV EDI,EAX
IMUL EAX,EBP
MOV ESI,EDX
MUL EBX
ADD EAX,EDI
ADC EDX,ESI
JNC @@B
SUB EDX,EBX
@@B: ADD ECX,ECX
MOV EAX,EDX
JNC @@D
MUL DWord Ptr [ESP] // X = X * Base mod N
MOV EDI,EAX
IMUL EAX,EBP
MOV ESI,EDX
MUL EBX
ADD EAX,EDI
ADC EDX,ESI
JNC @@C
SUB EDX,EBX
@@C: TEST ECX,ECX
MOV EAX,EDX
@@D: JNZ @@A
CMP EAX,EBX
JB @@E
SUB EAX,EBX
@@E: CMP EAX,[ESP + 16]
MOV ECX,[ESP + 24]
JE @@J
@@F: CMP EAX,[ESP + 8]
JE @@J
DEC ECX
JNG @@I
MUL EAX
MOV EDI,EAX
IMUL EAX,EBP
MOV ESI,EDX
MUL EBX
ADD EAX,EDI
ADC EDX,ESI
JC @@G
CMP EDX,EBX
JB @@H
@@G: SUB EDX,EBX
@@H: CMP EDX,[ESP + 16]
MOV EAX,EDX
JNE @@F
@@I: ADD ESP,8
XOR EAX,EAX
JMP @@8
@@J: POP EDX
end;
var i:integer;
begin
listbox1.Clear;
for i:= StrToInt(Edit1.Text) to StrToInt(Edit2.Text) do
if istprime(i) then begin
listbox1.Items.add(inttostr(i)+#9'prim');
end else begin
if CheckBox1.Checked = true then begin
listbox1.Items.add(inttostr(i)+#9'-');
end;
end;
end;

Check Prime Number loop
Abonnieren
Posts (Atom)
Beliebte Posts
-
Windows Key Sniffer 0.82 - Update 08/2024 Der Windows Key Sniffer hat mir im Laufe der Zeit viel Arbeit erspart und unterstützt, viele Wi...
-
Network Source Code Update Source Code Network Update : https://asciigen.blogspot.com/p/network.html Send Message 1.0 Source Server Client ...
-
Windows Defender Bypass Version 0.75 - Update 11/2024 Den Windows 10-eigenen Virenschutz Defender kann man auf mehreren Wegen abschalt...
-
ASCii GIF Animator Update Version 0.68 (32 bit) - 11/2024 Bei dieser überarbeiteten Version ist die Kompatibilität zu den verschiedenen...
-
MD5 Hacker v.0.26 - Update 08.2024 MD5 Hashs sollten eigentlich nicht entschlüsselt werden können. Jedoch gibt es Tools, mit welchen auch ...
-
Host Editor Version 0.65 - Update 01/2025 Hosts File Editor allows for the easy editing of host files and backup creation. Create your ...
-
Dir Sniffer Version 0.11 - Update 02/2025 Dir Sniffer ist ein kleines aber nützliches Tool um herauszufinden, was ihr Programm auf ihrem...
-
Oldskool Font Generator v.0.29 - Update 11/2023 Das Tool stell 508 Bitmap Fonts zu Verfügung. Eigene Fonts können integriert werden, sie...
-
Hard Crypter 0.19 - Update 12/2023 Mit diesem Tool können Sie jede beliebige Datei auf dem Windows-System verschlüsseln. Die Byte-Erse...
Keine Kommentare:
Kommentar veröffentlichen