1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183:
| function IstPrime(N: Cardinal): Boolean; const MaxPrime = 137; MaxTrial = MaxPrime * MaxPrime; MinPrime = 137; 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 = ($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 CMP EAX,7 JA @@1 DEC EAX SETNZ AL RET @@0: CMP EAX,2 SETZ AL RET @@1: PUSH EBP 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 @@2: MOV EDI,Offset Primes MOV ESI,Offset InvPrimes XOR ECX,ECX @@3: MOVZX EDX,Byte Ptr [EDI + ECX] 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 MOV EAX,EBX JBE @@4 IMUL EAX,EBX SUB EAX,2 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 MOV EDI,EBX MOV EAX,EBX DEC EDI NEG EAX BSF ECX,EDI MUL EAX PUSH ECX MOV ESI,EAX BSR ECX,EDI MOV EAX,EDX XOR EDX,EDX NEG ECX DIV EBX MOV EAX,ESI ADD ECX,32 DIV EBX SHL EDI,CL MOV EAX,EDX IMUL EAX,EBP MOV ESI,EDX MUL EBX PUSH ESI ADD EAX,ESI ADC EDX,0 PUSH EDX PUSH EDI NEG EDX ADD EDX,EBX CMP EBX,$08A8D7F PUSH EDX JAE @@6 MOV EAX,31 CALL @@9 MOV EAX,73 PUSH Offset @@7 JMP @@9 @@6: MOV EAX,2 CALL @@9 MOV EAX,7 CALL @@9 MOV EAX,61 CALL @@9 @@7: INC EAX @@8: LEA ESP,[ESP + 4 * 5] JMP @@4 @@9: MUL DWord Ptr [ESP + 16] MOV EDI,EAX IMUL EAX,EBP MOV ESI,EDX MUL EBX ADD EAX,EDI ADC EDX,ESI MOV ECX,[ESP + 8] MOV EAX,EDX PUSH EDX @@A: MUL EAX 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] 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; |