Sequence of primes by trial division: Difference between revisions
Content added Content deleted
m (→{{header|Tailspin}}: simplify) |
VincentARM (talk | contribs) (add task to arm assembly raspberry pi) |
||
Line 275: | Line 275: | ||
10: 29 |
10: 29 |
||
</pre> |
</pre> |
||
=={{header|ARM Assembly}}== |
|||
{{works with|as|Raspberry Pi <br> or android 32 bits with application Termux}} |
|||
<syntaxhighlight lang ARM Assembly> |
|||
/* ARM assembly Raspberry PI */ |
|||
/* program trialprime.s */ |
|||
/************************************/ |
|||
/* Constantes */ |
|||
/************************************/ |
|||
/* for this file see task include a file in language ARM assembly*/ |
|||
.include "../constantes.inc" |
|||
//.include "../../ficmacros32.inc" @ for debugging developper |
|||
/************************************/ |
|||
/* Initialized data */ |
|||
/************************************/ |
|||
.data |
|||
szMessPrime: .asciz " is prime.\n" |
|||
szMessNotPrime: .asciz " is not prime.\n" |
|||
szCarriageReturn: .asciz "\n" |
|||
szMessStart: .asciz "Program 32 bits start.\n" |
|||
/************************************/ |
|||
/* UnInitialized data */ |
|||
/************************************/ |
|||
.bss |
|||
sZoneConv: .skip 24 |
|||
/************************************/ |
|||
/* code section */ |
|||
/************************************/ |
|||
.text |
|||
.global main |
|||
main: @ entry of program |
|||
ldr r0,iAdrszMessStart |
|||
bl affichageMess |
|||
ldr r4,iStart @ start number |
|||
ldr r5,iLimit @ end number |
|||
tst r4,#1 |
|||
addeq r4,#1 |
|||
1: |
|||
mov r0,r4 |
|||
ldr r1,iAdrsZoneConv |
|||
bl conversion10 @ decimal conversion |
|||
ldr r0,iAdrsZoneConv |
|||
bl affichageMess |
|||
mov r0,r4 |
|||
bl isPrime |
|||
cmp r0,#0 |
|||
beq 2f |
|||
ldr r0,iAdrszMessPrime |
|||
bl affichageMess |
|||
b 3f |
|||
2: |
|||
ldr r0,iAdrszMessNotPrime |
|||
bl affichageMess |
|||
3: |
|||
add r4,r4,#2 |
|||
cmp r4,r5 |
|||
blt 1b |
|||
100: @ standard end of the program |
|||
mov r0, #0 @ return code |
|||
mov r7, #EXIT @ request to exit program |
|||
swi 0 @ perform the system call |
|||
iAdrsZoneConv: .int sZoneConv |
|||
iAdrszMessPrime: .int szMessPrime |
|||
iAdrszMessNotPrime: .int szMessNotPrime |
|||
iAdrszCarriageReturn: .int szCarriageReturn |
|||
iAdrszMessStart: .int szMessStart |
|||
iStart: .int 4000000000 |
|||
iLimit: .int 4000000020 |
|||
/******************************************************************/ |
|||
/* test if number is prime */ |
|||
/******************************************************************/ |
|||
/* r0 contains the number */ |
|||
/* r0 return 1 if prime else return 0 */ |
|||
isPrime: |
|||
push {r4,lr} @ save registers |
|||
cmp r0,#1 @ <= 1 ? |
|||
movls r0,#0 @ not prime |
|||
bls 100f |
|||
cmp r0,#3 @ 2 and 3 prime |
|||
movls r0,#1 |
|||
bls 100f |
|||
tst r0,#1 @ even ? |
|||
moveq r0,#0 @ not prime |
|||
beq 100f |
|||
mov r4,r0 @ save number |
|||
mov r1,#3 @ first divisor |
|||
1: |
|||
mov r0,r4 @ number |
|||
bl division |
|||
add r1,r1,#2 @ increment divisor |
|||
cmp r3,#0 @ remainder = zero ? |
|||
moveq r0,#0 @ not prime |
|||
beq 100f |
|||
cmp r1,r2 @ divisors<=quotient ? |
|||
ble 1b @ loop |
|||
mov r0,#1 @ return prime |
|||
100: |
|||
pop {r4,pc} @ restaur registers |
|||
/***************************************************/ |
|||
/* ROUTINES INCLUDE */ |
|||
/***************************************************/ |
|||
/* for this file see task include a file in language ARM assembly*/ |
|||
.include "../affichage.inc" |
|||
</syntaxhighlight> |
|||
{{Out}} |
|||
<pre> |
|||
Program 32 bits start. |
|||
4000000001 is not prime. |
|||
4000000003 is not prime. |
|||
4000000005 is not prime. |
|||
4000000007 is prime. |
|||
4000000009 is prime. |
|||
4000000011 is not prime. |
|||
4000000013 is not prime. |
|||
4000000015 is not prime. |
|||
4000000017 is not prime. |
|||
4000000019 is prime. |
|||
</pre> |
|||
=={{header|Arturo}}== |
=={{header|Arturo}}== |
||