Hi Anton :)

> Does the function return false for 0 and 1?

Yes

> How easy isit to upgrade for > 64 bit lengths?

Indeed, isprime() is part of a routine working with the 'nat' big
numbers of the unit bigint10. Its purpose is to perform a primality
check by a strong test to the base 2 and a Lucas test. But up to 32
bits it is enough a Miller-Rabin test to bases 2, 7 and 61, which
covers up to 4,759,123,141. To do this, isprime() must evaluate
some powers and squares modulo a cardinal involving 64 bit operands.
I write here the function, so it may be used and tested. If there
are problems let me know.

Franco Milani
-------------------------------------------------------------------------

CONST

arlc_ispv: array [1..18] of cardinal =
(61,59,53,47,43,41,37,31,29,23,19,17,13,11,7,5,3,2);

VAR

vloc_ispa,vloc_ispb,vloc_ispc,vloc_ispd,vloc_ispe,vloc_ispf: cardinal;

FUNCTION isprime (n: cardinal): boolean; assembler;
asm
        movl    8(%ebp),%ebx
        leal    arlc_ispv,%edi
        movl    $17,%ecx
        cmpl    $61,%ebx
        ja      .L5
.L6:    cmpl    (%edi,%ecx,4),%ebx
        je      .L7
        decl    %ecx
        jns     .L6
        jmp     .L8
.L5:    movl    %ebx,%eax
        xorl    %edx,%edx
        movl    (%edi,%ecx,4),%esi
        divl    %esi
        cmpl    $0,%edx
        je      .L8
        decl    %ecx
        jns     .L5
        decl    %ebx
        movl    %ebx,vloc_ispa
        xorl    %ecx,%ecx
        testl   $1,%ebx
        jnz     .L9
.L10:   shrl    $1,%ebx
        incl    %ecx
        testl   $1,%ebx
        jz      .L10
.L9:    movl    %ebx,vloc_ispb
        cmpl    $0,%ecx
        je      .L11
        decl    %ecx
.L11:   movl    %ecx,vloc_ispc
        movl    $2,vloc_ispd
        movl    $2,%eax
        jmp     .L12
.L13:   movl    $7,%eax
        jmp     .L12
.L14:   movl    $61,%eax
.L12:   movl    vloc_ispb,%ebx
        movl    8(%ebp),%ecx
        cmpl    $1,%ebx
        jne     .L15
        xorl    %edx,%edx
        divl    %ecx
        movl    %edx,%eax
        jmp     .L16
.L15:   movl    %eax,%edi
        bsrl    %ebx,%edx
        movl    %edx,vloc_ispe
        btl     $0,%ebx
        jnc     .L17
        movl    %eax,%esi
        jmp     .L18
.L17:   movl    $1,%esi
.L18:   movl    $1,vloc_ispf
.L19:   movl    %edi,%eax
        mull    %edi
        cmpl    %ecx,%edx
        jb      .L20
        movl    %eax,%ebx
        movl    %edx,%eax
        xorl    %edx,%edx
        divl    %ecx
        movl    %ebx,%eax
.L20:   divl    %ecx
        movl    %edx,%edi
        movl    vloc_ispb,%eax
        movl    vloc_ispf,%ebx
        btl     %ebx,%eax
        jnc     .L21
        movl    %esi,%eax
        mull    %edi
        cmpl    %ecx,%edx
        jb      .L22
        movl    %eax,%ebx
        movl    %edx,%eax
        xorl    %edx,%edx
        divl    %ecx
        movl    %ebx,%eax
.L22:   divl    %ecx
        movl    %edx,%esi
.L21:   incl    vloc_ispf
        decl    vloc_ispe
        jnz     .L19
        movl    %esi,%eax
.L16:   cmpl    $1,%eax
        je      .L23
        cmpl    vloc_ispa,%eax
        je      .L23
        cmpl    $0,vloc_ispc
        je      .L8
        movl    vloc_ispc,%esi
.L24:   mull    %eax
        cmpl    %ecx,%edx
        jb      .L25
        movl    %eax,%ebx
        movl    %edx,%eax
        xorl    %edx,%edx
        divl    %ecx
        movl    %ebx,%eax
.L25:   divl    %ecx
        movl    %edx,%eax
        cmpl    vloc_ispa,%eax
        je      .L23
        cmpl    $1,%eax
        je      .L8
.L26:   decl    %esi
        jnz     .L24
        jmp     .L8
.L23:   decl    vloc_ispd
        jz      .L14
        jns     .L13
.L7:    movl    $1,%eax
        jmp     .L27
.L8:    xorl    %eax,%eax
.L27:   end;


_______________________________________________
fpc-pascal maillist  -  [EMAIL PROTECTED]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to