September Morn Update
This commit is contained in:
parent
4e2d22a71d
commit
aac6731f2c
6856 changed files with 141342 additions and 21127 deletions
221
Task/Almost-prime/ARM-Assembly/almost-prime.arm
Normal file
221
Task/Almost-prime/ARM-Assembly/almost-prime.arm
Normal file
|
|
@ -0,0 +1,221 @@
|
|||
/* ARM assembly Raspberry PI */
|
||||
/* program kprime.s */
|
||||
|
||||
/************************************/
|
||||
/* Constantes */
|
||||
/************************************/
|
||||
.equ STDOUT, 1 @ Linux output console
|
||||
.equ EXIT, 1 @ Linux syscall
|
||||
.equ WRITE, 4 @ Linux syscall
|
||||
|
||||
.equ MAXI, 10
|
||||
.equ MAXIK, 5
|
||||
/*********************************/
|
||||
/* Initialized data */
|
||||
/*********************************/
|
||||
.data
|
||||
sMessDeb: .ascii "k="
|
||||
sMessValeurDeb: .fill 11, 1, ' ' @ size => 11
|
||||
|
||||
sMessResult: .ascii " "
|
||||
sMessValeur: .fill 11, 1, ' ' @ size => 11
|
||||
|
||||
szCarriageReturn: .asciz "\n"
|
||||
|
||||
|
||||
/*********************************/
|
||||
/* UnInitialized data */
|
||||
/*********************************/
|
||||
.bss
|
||||
/*********************************/
|
||||
/* code section */
|
||||
/*********************************/
|
||||
.text
|
||||
.global main
|
||||
main: @ entry of program
|
||||
mov r3,#1 @ k
|
||||
1: @ start loop k
|
||||
mov r0,r3
|
||||
ldr r1,iAdrsMessValeurDeb
|
||||
bl conversion10 @ call conversion decimal
|
||||
ldr r0,iAdrsMessValeurDeb
|
||||
mov r1,#':'
|
||||
strb r1,[r0,#2] @ write : after k value
|
||||
mov r1,#0
|
||||
strb r1,[r0,#3] @ final zéro
|
||||
ldr r0,iAdrsMessDeb
|
||||
bl affichageMess @ display message
|
||||
mov r4,#2 @ n
|
||||
mov r5,#0 @ result counter
|
||||
2: @ start loop n
|
||||
mov r0,r4
|
||||
mov r1,r3
|
||||
bl kprime @ is kprine ?
|
||||
cmp r0,#0
|
||||
beq 3f @ no
|
||||
mov r0,r4
|
||||
ldr r1,iAdrsMessValeur
|
||||
bl conversion10 @ call conversion decimal
|
||||
ldr r0,iAdrsMessValeur
|
||||
mov r1,#0
|
||||
strb r1,[r0,#4] @ final zéro
|
||||
ldr r0,iAdrsMessResult
|
||||
bl affichageMess @ display message
|
||||
add r5,#1 @ increment counter
|
||||
3:
|
||||
add r4,#1 @ increment n
|
||||
cmp r5,#MAXI @ maxi ?
|
||||
blt 2b @ no -> loop
|
||||
ldr r0,iAdrszCarriageReturn
|
||||
bl affichageMess @ display carriage return
|
||||
add r3,#1 @ increment k
|
||||
cmp r3,#MAXIK @ maxi ?
|
||||
ble 1b @ no -> loop
|
||||
|
||||
100: @ standard end of the program
|
||||
mov r0, #0 @ return code
|
||||
mov r7, #EXIT @ request to exit program
|
||||
svc #0 @ perform the system call
|
||||
|
||||
iAdrsMessValeur: .int sMessValeur
|
||||
iAdrszCarriageReturn: .int szCarriageReturn
|
||||
iAdrsMessResult: .int sMessResult
|
||||
iAdrsMessValeurDeb: .int sMessValeurDeb
|
||||
iAdrsMessDeb: .int sMessDeb
|
||||
/******************************************************************/
|
||||
/* compute kprime (n,k) */
|
||||
/******************************************************************/
|
||||
/* r0 contains n */
|
||||
/* r1 contains k */
|
||||
kprime:
|
||||
push {r1-r7,lr} @ save registers
|
||||
mov r5,r0 @ save n
|
||||
mov r7,r1 @ save k
|
||||
mov r4,#0 @ counter product
|
||||
mov r1,#2 @ divisor
|
||||
1: @ start loop
|
||||
cmp r4,r7 @ counter >= k
|
||||
bge 4f @ yes -> end
|
||||
mul r6,r1,r1 @ compute product
|
||||
cmp r6,r5 @ > n
|
||||
bgt 4f @ yes -> end
|
||||
2: @ start loop division
|
||||
mov r0,r5 @ dividende
|
||||
bl division @ by r1
|
||||
cmp r3,#0 @ remainder = 0 ?
|
||||
bne 3f @ no
|
||||
mov r5,r2 @ yes -> n = n / r1
|
||||
add r4,#1 @ increment counter
|
||||
b 2b @ and loop
|
||||
3:
|
||||
add r1,#1 @ increment divisor
|
||||
b 1b @ and loop
|
||||
4: @ end compute
|
||||
cmp r5,#1 @ n > 1
|
||||
addgt r4,#1 @ yes increment counter
|
||||
cmp r4,r7 @ counter = k ?
|
||||
movne r0,#0 @ no -> no kprime
|
||||
moveq r0,#1 @ yes -> kprime
|
||||
100:
|
||||
pop {r1-r7,lr} @ restaur registers
|
||||
bx lr @return
|
||||
/******************************************************************/
|
||||
/* display text with size calculation */
|
||||
/******************************************************************/
|
||||
/* r0 contains the address of the message */
|
||||
affichageMess:
|
||||
push {r0,r1,r2,r7,lr} @ save registres
|
||||
mov r2,#0 @ counter length
|
||||
1: @ loop length calculation
|
||||
ldrb r1,[r0,r2] @ read octet start position + index
|
||||
cmp r1,#0 @ if 0 its over
|
||||
addne r2,r2,#1 @ else add 1 in the length
|
||||
bne 1b @ and loop
|
||||
@ so here r2 contains the length of the message
|
||||
mov r1,r0 @ address message in r1
|
||||
mov r0,#STDOUT @ code to write to the standard output Linux
|
||||
mov r7, #WRITE @ code call system "write"
|
||||
svc #0 @ call systeme
|
||||
pop {r0,r1,r2,r7,lr} @ restaur des 2 registres */
|
||||
bx lr @ return
|
||||
/******************************************************************/
|
||||
/* Converting a register to a decimal unsigned */
|
||||
/******************************************************************/
|
||||
/* r0 contains value and r1 address area */
|
||||
/* r0 return size of result (no zero final in area) */
|
||||
/* area size => 11 bytes */
|
||||
.equ LGZONECAL, 10
|
||||
conversion10:
|
||||
push {r1-r4,lr} @ save registers
|
||||
mov r3,r1
|
||||
mov r2,#LGZONECAL
|
||||
1: @ start loop
|
||||
bl divisionpar10U @ unsigned r0 <- dividende. quotient ->r0 reste -> r1
|
||||
add r1,#48 @ digit
|
||||
strb r1,[r3,r2] @ store digit on area
|
||||
cmp r0,#0 @ stop if quotient = 0
|
||||
subne r2,#1 @ else previous position
|
||||
bne 1b @ and loop
|
||||
@ and move digit from left of area
|
||||
mov r4,#0
|
||||
2:
|
||||
ldrb r1,[r3,r2]
|
||||
strb r1,[r3,r4]
|
||||
add r2,#1
|
||||
add r4,#1
|
||||
cmp r2,#LGZONECAL
|
||||
ble 2b
|
||||
@ and move spaces in end on area
|
||||
mov r0,r4 @ result length
|
||||
mov r1,#' ' @ space
|
||||
3:
|
||||
strb r1,[r3,r4] @ store space in area
|
||||
add r4,#1 @ next position
|
||||
cmp r4,#LGZONECAL
|
||||
ble 3b @ loop if r4 <= area size
|
||||
|
||||
100:
|
||||
pop {r1-r4,lr} @ restaur registres
|
||||
bx lr @return
|
||||
|
||||
/***************************************************/
|
||||
/* division par 10 unsigned */
|
||||
/***************************************************/
|
||||
/* r0 dividende */
|
||||
/* r0 quotient */
|
||||
/* r1 remainder */
|
||||
divisionpar10U:
|
||||
push {r2,r3,r4, lr}
|
||||
mov r4,r0 @ save value
|
||||
ldr r3,iMagicNumber @ r3 <- magic_number raspberry 1 2
|
||||
umull r1, r2, r3, r0 @ r1<- Lower32Bits(r1*r0) r2<- Upper32Bits(r1*r0)
|
||||
mov r0, r2, LSR #3 @ r2 <- r2 >> shift 3
|
||||
add r2,r0,r0, lsl #2 @ r2 <- r0 * 5
|
||||
sub r1,r4,r2, lsl #1 @ r1 <- r4 - (r2 * 2) = r4 - (r0 * 10)
|
||||
pop {r2,r3,r4,lr}
|
||||
bx lr @ leave function
|
||||
iMagicNumber: .int 0xCCCCCCCD
|
||||
/***************************************************/
|
||||
/* integer division unsigned */
|
||||
/***************************************************/
|
||||
division:
|
||||
/* r0 contains dividend */
|
||||
/* r1 contains divisor */
|
||||
/* r2 returns quotient */
|
||||
/* r3 returns remainder */
|
||||
push {r4, lr}
|
||||
mov r2, #0 @ init quotient
|
||||
mov r3, #0 @ init remainder
|
||||
mov r4, #32 @ init counter bits
|
||||
b 2f
|
||||
1: @ loop
|
||||
movs r0, r0, LSL #1 @ r0 <- r0 << 1 updating cpsr (sets C if 31st bit of r0 was 1)
|
||||
adc r3, r3, r3 @ r3 <- r3 + r3 + C. This is equivalent to r3 ? (r3 << 1) + C
|
||||
cmp r3, r1 @ compute r3 - r1 and update cpsr
|
||||
subhs r3, r3, r1 @ if r3 >= r1 (C=1) then r3 <- r3 - r1
|
||||
adc r2, r2, r2 @ r2 <- r2 + r2 + C. This is equivalent to r2 <- (r2 << 1) + C
|
||||
2:
|
||||
subs r4, r4, #1 @ r4 <- r4 - 1
|
||||
bpl 1b @ if r4 >= 0 (N=0) then loop
|
||||
pop {r4, lr}
|
||||
bx lr
|
||||
|
|
@ -1,18 +1,18 @@
|
|||
fun kprime(n: int, k: int): bool =
|
||||
let kprime(n: i32, k: i32): bool =
|
||||
let (p,f) = (2, 0)
|
||||
loop ((n, p, f)) = while f < k && p*p <= n do
|
||||
loop ((n,f)) = while 0 == n % p do
|
||||
let (n,_,f) = loop (n, p, f) while f < k && p*p <= n do
|
||||
let (n,f) = loop (n, f) while 0 == n % p do
|
||||
(n/p, f+1)
|
||||
in (n, p+1, f)
|
||||
in f + (if n > 1 then 1 else 0) == k
|
||||
|
||||
fun main(m: int): [][]int =
|
||||
map (fn k: [10]int =>
|
||||
let ps = replicate 10 0
|
||||
loop ((i,c,ps) = (2,0,ps)) = while c < 10 do
|
||||
if kprime(i,k) then
|
||||
unsafe let ps[c] = i
|
||||
in (i+1, c+1, ps)
|
||||
else (i+1, c, ps)
|
||||
in ps)
|
||||
(map (1+) (iota m))
|
||||
let main(m: i32): [][]i32 =
|
||||
let f k =
|
||||
let ps = replicate 10 0
|
||||
let (_,_,ps) = loop (i,c,ps) = (2,0,ps) while c < 10 do
|
||||
if kprime(i,k) then
|
||||
unsafe let ps[c] = i
|
||||
in (i+1, c+1, ps)
|
||||
else (i+1, c, ps)
|
||||
in ps
|
||||
in map f (1...m)
|
||||
|
|
|
|||
17
Task/Almost-prime/Julia/almost-prime-2.julia
Normal file
17
Task/Almost-prime/Julia/almost-prime-2.julia
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
using Primes
|
||||
|
||||
isalmostprime(n::Integer, k::Integer) = sum(values(factor(n))) == k
|
||||
|
||||
function almostprimes(N::Integer, k::Integer) # return first N almost-k primes
|
||||
P = Vector{typeof(k)}(undef,N)
|
||||
i = 0; n = 2
|
||||
while i < N
|
||||
if isalmostprime(n, k) P[i += 1] = n end
|
||||
n += 1
|
||||
end
|
||||
return P
|
||||
end
|
||||
|
||||
for k in 1:5
|
||||
println("$k-Almost-primes: ", join(almostprimes(10, k), ", "), "...")
|
||||
end
|
||||
26
Task/Almost-prime/Liberty-BASIC/almost-prime.liberty
Normal file
26
Task/Almost-prime/Liberty-BASIC/almost-prime.liberty
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
for k = 1 to 5
|
||||
print "k = "; k; ": ";
|
||||
i = 2
|
||||
c = 0
|
||||
while c < 10
|
||||
if kPrime(i, k) then
|
||||
print using("###", i); " ";
|
||||
c = c + 1
|
||||
end if
|
||||
i = i + 1
|
||||
wend
|
||||
print
|
||||
next k
|
||||
end
|
||||
|
||||
function kPrime(n, k)
|
||||
f = 0
|
||||
for i = 2 to n
|
||||
while n mod i = 0
|
||||
if f = k then kPrime = 0: exit function
|
||||
f = f + 1
|
||||
n = int(n / i)
|
||||
wend
|
||||
next i
|
||||
kPrime = abs(f = k)
|
||||
end function
|
||||
37
Task/Almost-prime/Python/almost-prime-2.py
Normal file
37
Task/Almost-prime/Python/almost-prime-2.py
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
# k-Almost-primes
|
||||
# Python 3.6.3
|
||||
# no imports
|
||||
|
||||
def prime_factors(m=2):
|
||||
|
||||
for i in range(2, m):
|
||||
r, q = divmod(m, i)
|
||||
if not q:
|
||||
return [i] + prime_factors(r)
|
||||
return [m]
|
||||
|
||||
def k_almost_primes(n, k=2):
|
||||
multiples = set()
|
||||
lists = list()
|
||||
for x in range(k+1):
|
||||
lists.append([])
|
||||
|
||||
for i in range(2, n+1):
|
||||
if i not in multiples:
|
||||
if len(lists[1]) < 10:
|
||||
lists[1].append(i)
|
||||
multiples.update(range(i*i, n+1, i))
|
||||
print("k=1: {}".format(lists[1]))
|
||||
|
||||
for j in range(2, k+1):
|
||||
for m in multiples:
|
||||
l = prime_factors(m)
|
||||
ll = len(l)
|
||||
if ll == j and len(lists[j]) < 10:
|
||||
lists[j].append(m)
|
||||
|
||||
print("k={}: {}".format(j, lists[j]))
|
||||
|
||||
k_almost_primes(200, 5)
|
||||
# try:
|
||||
#k_almost_primes(6000, 10)
|
||||
|
|
@ -2,11 +2,7 @@ require 'prime'
|
|||
|
||||
def almost_primes(k=2)
|
||||
return to_enum(:almost_primes, k) unless block_given?
|
||||
n = 0
|
||||
loop do
|
||||
n += 1
|
||||
yield n if n.prime_division.map( &:last ).inject( &:+ ) == k
|
||||
end
|
||||
1.step {|n| yield n if n.prime_division.sum( &:last ) == k }
|
||||
end
|
||||
|
||||
(1..5).each{|k| puts almost_primes(k).take(10).join(", ")}
|
||||
|
|
|
|||
37
Task/Almost-prime/Seed7/almost-prime.seed7
Normal file
37
Task/Almost-prime/Seed7/almost-prime.seed7
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
$ include "seed7_05.s7i";
|
||||
|
||||
const func boolean: kprime (in var integer: number, in integer: k) is func
|
||||
result
|
||||
var boolean: kprime is FALSE;
|
||||
local
|
||||
var integer: p is 2;
|
||||
var integer: f is 0;
|
||||
begin
|
||||
while f < k and p * p <= number do
|
||||
while number rem p = 0 do
|
||||
number := number div p;
|
||||
incr(f);
|
||||
end while;
|
||||
incr(p);
|
||||
end while;
|
||||
kprime := f + ord(number > 1) = k;
|
||||
end func;
|
||||
|
||||
const proc: main is func
|
||||
local
|
||||
var integer: k is 0;
|
||||
var integer: number is 0;
|
||||
var integer: count is 0;
|
||||
begin
|
||||
for k range 1 to 5 do
|
||||
write("k = " <& k <& ":");
|
||||
count := 0;
|
||||
for number range 2 to integer.last until count >= 10 do
|
||||
if kprime(number, k) then
|
||||
write(" " <& number);
|
||||
incr(count);
|
||||
end if;
|
||||
end for;
|
||||
writeln;
|
||||
end for;
|
||||
end func;
|
||||
32
Task/Almost-prime/VBA/almost-prime.vba
Normal file
32
Task/Almost-prime/VBA/almost-prime.vba
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
Private Function kprime(ByVal n As Integer, k As Integer) As Boolean
|
||||
Dim p As Integer, factors As Integer
|
||||
p = 2
|
||||
factors = 0
|
||||
Do While factors < k And p * p <= n
|
||||
Do While n Mod p = 0
|
||||
n = n / p
|
||||
factors = factors + 1
|
||||
Loop
|
||||
p = p + 1
|
||||
Loop
|
||||
factors = factors - (n > 1) 'true=-1
|
||||
kprime = factors = k
|
||||
End Function
|
||||
|
||||
Private Sub almost_primeC()
|
||||
Dim nextkprime As Integer, count As Integer
|
||||
Dim k As Integer
|
||||
For k = 1 To 5
|
||||
Debug.Print "k ="; k; ":";
|
||||
nextkprime = 2
|
||||
count = 0
|
||||
Do While count < 10
|
||||
If kprime(nextkprime, k) Then
|
||||
Debug.Print " "; Format(CStr(nextkprime), "@@@@@");
|
||||
count = count + 1
|
||||
End If
|
||||
nextkprime = nextkprime + 1
|
||||
Loop
|
||||
Debug.Print
|
||||
Next k
|
||||
End Sub
|
||||
44
Task/Almost-prime/Visual-Basic-.NET/almost-prime.visual
Normal file
44
Task/Almost-prime/Visual-Basic-.NET/almost-prime.visual
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
Module Module1
|
||||
|
||||
Class KPrime
|
||||
Public K As Integer
|
||||
|
||||
Public Function IsKPrime(number As Integer) As Boolean
|
||||
Dim primes = 0
|
||||
Dim p = 2
|
||||
While p * p <= number AndAlso primes < K
|
||||
While number Mod p = 0 AndAlso primes < K
|
||||
number = number / p
|
||||
primes = primes + 1
|
||||
End While
|
||||
p = p + 1
|
||||
End While
|
||||
If number > 1 Then
|
||||
primes = primes + 1
|
||||
End If
|
||||
Return primes = K
|
||||
End Function
|
||||
|
||||
Public Function GetFirstN(n As Integer) As List(Of Integer)
|
||||
Dim result As New List(Of Integer)
|
||||
Dim number = 2
|
||||
While result.Count < n
|
||||
If IsKPrime(number) Then
|
||||
result.Add(number)
|
||||
End If
|
||||
number = number + 1
|
||||
End While
|
||||
Return result
|
||||
End Function
|
||||
End Class
|
||||
|
||||
Sub Main()
|
||||
For Each k In Enumerable.Range(1, 5)
|
||||
Dim kprime = New KPrime With {
|
||||
.K = k
|
||||
}
|
||||
Console.WriteLine("k = {0}: {1}", k, String.Join(" ", kprime.GetFirstN(10)))
|
||||
Next
|
||||
End Sub
|
||||
|
||||
End Module
|
||||
Loading…
Add table
Add a link
Reference in a new issue