Data update
This commit is contained in:
parent
0df55f9f24
commit
aec8ed51b6
1045 changed files with 18889 additions and 2777 deletions
11
Task/Prime-decomposition/Bruijn/prime-decomposition.bruijn
Normal file
11
Task/Prime-decomposition/Bruijn/prime-decomposition.bruijn
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
:import std/Combinator .
|
||||
:import std/List .
|
||||
:import std/Math .
|
||||
|
||||
factors \divs primes
|
||||
divs y [[&[[&[[3 ⋅ 3 >? 4 case-1 (=?0 case-2 case-3)]] (quot-rem 2 1)]]]]
|
||||
case-1 4 >? (+1) {}4 empty
|
||||
case-2 3 : (5 1 (3 : 2))
|
||||
case-3 5 4 2
|
||||
|
||||
main [factors <$> ({ (+42) → (+50) })]
|
||||
|
|
@ -28,5 +28,5 @@ function prime-decomposition ($n) {
|
|||
}
|
||||
$prime
|
||||
}
|
||||
"$(prime-decomposition 12)"
|
||||
"$(prime-decomposition 100)"
|
||||
"$(prime-decomposition 12)"
|
||||
"$(prime-decomposition 100)"
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
function prime-decomposition ($n) {
|
||||
$values = [System.Collections.Generic.List[string]]::new()
|
||||
while ((($n % 2) -eq 0) -and ($n -gt 2)) {
|
||||
$values.Add(2)
|
||||
$n /= 2
|
||||
}
|
||||
for ($i = 3; $n -ge ($i * $i); $i += 2) {
|
||||
if (($n % $i) -eq 0){
|
||||
$values.Add($i)
|
||||
$n /= $i
|
||||
$i -= 2
|
||||
}
|
||||
}
|
||||
$values.Add($n)
|
||||
return $values
|
||||
}
|
||||
"$(prime-decomposition 1000000)"
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
/*REXX pgm does prime decomposition of a range of positive integers (with a prime count)*/
|
||||
numeric digits 1000 /*handle thousand digits for the powers*/
|
||||
parse arg bot top step base add /*get optional arguments from the C.L. */
|
||||
if bot=='' then do; bot=1; top=100; end /*no BOT given? Then use the default.*/
|
||||
if top=='' then top=bot /* " TOP? " " " " " */
|
||||
if step=='' then step= 1 /* " STEP? " " " " " */
|
||||
if add =='' then add= -1 /* " ADD? " " " " " */
|
||||
tell= top>0; top=abs(top) /*if TOP is negative, suppress displays*/
|
||||
w=length(top) /*get maximum width for aligned display*/
|
||||
if base\=='' then w=length(base**top) /*will be testing powers of two later? */
|
||||
@.=left('', 7); @.0="{unity}"; @.1='[prime]' /*some literals: pad; prime (or not).*/
|
||||
numeric digits max(9, w+1) /*maybe increase the digits precision. */
|
||||
#=0 /*#: is the number of primes found. */
|
||||
do n=bot to top by step /*process a single number or a range.*/
|
||||
?=n; if base\=='' then ?=base**n + add /*should we perform a "Mercenne" test? */
|
||||
pf=factr(?); f=words(pf) /*get prime factors; number of factors.*/
|
||||
if f==1 then #=#+1 /*Is N prime? Then bump prime counter.*/
|
||||
if tell then say right(?,w) right('('f")",9) 'prime factors: ' @.f pf
|
||||
end /*n*/
|
||||
say
|
||||
ps= 'primes'; if p==1 then ps= "prime" /*setup for proper English in sentence.*/
|
||||
say right(#, w+9+1) ps 'found.' /*display the number of primes found. */
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
factr: procedure; parse arg x 1 d,$ /*set X, D to argument 1; $ to null.*/
|
||||
if x==1 then return '' /*handle the special case of X = 1. */
|
||||
do while x//2==0; $=$ 2; x=x%2; end /*append all the 2 factors of new X.*/
|
||||
do while x//3==0; $=$ 3; x=x%3; end /* " " " 3 " " " " */
|
||||
do while x//5==0; $=$ 5; x=x%5; end /* " " " 5 " " " " */
|
||||
do while x//7==0; $=$ 7; x=x%7; end /* " " " 7 " " " " */
|
||||
/* ___*/
|
||||
q=1; do while q<=x; q=q*4; end /*these two lines compute integer √ X */
|
||||
r=0; do while q>1; q=q%4; _=d-r-q; r=r%2; if _>=0 then do; d=_; r=r+q; end; end
|
||||
|
||||
do j=11 by 6 to r /*insure that J isn't divisible by 3.*/
|
||||
parse var j '' -1 _ /*obtain the last decimal digit of J. */
|
||||
if _\==5 then do while x//j==0; $=$ j; x=x%j; end /*maybe reduce by J. */
|
||||
if _ ==3 then iterate /*Is next Y is divisible by 5? Skip.*/
|
||||
y=j+2; do while x//y==0; $=$ y; x=x%y; end /*maybe reduce by J. */
|
||||
end /*j*/
|
||||
/* [↓] The $ list has a leading blank.*/
|
||||
if x==1 then return $ /*Is residual=unity? Then don't append.*/
|
||||
return $ x /*return $ with appended residual. */
|
||||
|
|
@ -1,48 +1,81 @@
|
|||
/*REXX pgm does prime decomposition of a range of positive integers (with a prime count)*/
|
||||
numeric digits 1000 /*handle thousand digits for the powers*/
|
||||
parse arg bot top step base add /*get optional arguments from the C.L. */
|
||||
if bot=='' then do; bot=1; top=100; end /*no BOT given? Then use the default.*/
|
||||
if top=='' then top=bot /* " TOP? " " " " " */
|
||||
if step=='' then step= 1 /* " STEP? " " " " " */
|
||||
if add =='' then add= -1 /* " ADD? " " " " " */
|
||||
tell= top>0; top=abs(top) /*if TOP is negative, suppress displays*/
|
||||
w=length(top) /*get maximum width for aligned display*/
|
||||
if base\=='' then w=length(base**top) /*will be testing powers of two later? */
|
||||
@.=left('', 7); @.0="{unity}"; @.1='[prime]' /*some literals: pad; prime (or not).*/
|
||||
numeric digits max(9, w+1) /*maybe increase the digits precision. */
|
||||
#=0 /*#: is the number of primes found. */
|
||||
do n=bot to top by step /*process a single number or a range.*/
|
||||
?=n; if base\=='' then ?=base**n + add /*should we perform a "Mercenne" test? */
|
||||
pf=factr(?); f=words(pf) /*get prime factors; number of factors.*/
|
||||
if f==1 then #=#+1 /*Is N prime? Then bump prime counter.*/
|
||||
if tell then say right(?,w) right('('f")",9) 'prime factors: ' @.f pf
|
||||
end /*n*/
|
||||
say
|
||||
ps= 'primes'; if p==1 then ps= "prime" /*setup for proper English in sentence.*/
|
||||
say right(#, w+9+1) ps 'found.' /*display the number of primes found. */
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
factr: procedure; parse arg x 1 d,$ /*set X, D to argument 1; $ to null.*/
|
||||
if x==1 then return '' /*handle the special case of X = 1. */
|
||||
do while x// 2==0; $=$ 2; x=x%2; end /*append all the 2 factors of new X.*/
|
||||
do while x// 3==0; $=$ 3; x=x%3; end /* " " " 3 " " " " */
|
||||
do while x// 5==0; $=$ 5; x=x%5; end /* " " " 5 " " " " */
|
||||
do while x// 7==0; $=$ 7; x=x%7; end /* " " " 7 " " " " */
|
||||
do while x//11==0; $=$ 11; x=x%11; end /* " " " 11 " " " " */ /* ◄■■■■ added.*/
|
||||
do while x//13==0; $=$ 13; x=x%13; end /* " " " 13 " " " " */ /* ◄■■■■ added.*/
|
||||
do while x//17==0; $=$ 17; x=x%17; end /* " " " 17 " " " " */ /* ◄■■■■ added.*/
|
||||
do while x//19==0; $=$ 19; x=x%19; end /* " " " 19 " " " " */ /* ◄■■■■ added.*/
|
||||
do while x//23==0; $=$ 23; x=x%23; end /* " " " 23 " " " " */ /* ◄■■■■ added.*/
|
||||
/* ___*/
|
||||
q=1; do while q<=x; q=q*4; end /*these two lines compute integer √ X */
|
||||
r=0; do while q>1; q=q%4; _=d-r-q; r=r%2; if _>=0 then do; d=_; r=r+q; end; end
|
||||
Numeric Digits 1000 /*handle thousand digits For the powers*/
|
||||
Parse Arg bot top step base add /*get optional arguments from the C.L. */
|
||||
If bot='?' Then Do
|
||||
Say 'rexx pfoo bot top step base add'
|
||||
Exit
|
||||
End
|
||||
If bot=='' Then /* no arguments given */
|
||||
Parse Value 1 100 With bot top /* set default range .*/
|
||||
If top=='' Then top=bot /* process one number */
|
||||
If step=='' Then step=1 /* step=2 to process only odd numbers */
|
||||
If add =='' Then add=-1 /* for Mersenne tests */
|
||||
tell=top>0 /*If TOP is negative, suppress displays*/
|
||||
top=abs(top)
|
||||
w=length(top) /*get maximum width For aligned display*/
|
||||
If base\=='' Then
|
||||
w=length(base**top) /*will be testing powers of two later? */
|
||||
tag.=left('', 7) /*some literals: pad; prime (or not).*/
|
||||
tag.0='{unity}'
|
||||
tag.1='[prime]'
|
||||
Numeric Digits max(9,w+1) /*maybe increase the digits precision. */
|
||||
np=0 /*np: is the number of primes found.*/
|
||||
Do n=bot To top by step /*process a single number or a range. */
|
||||
?=n
|
||||
If base\=='' Then /*should we perform a 'Mersenne' test? */
|
||||
?=base**n+add
|
||||
pf=factr(?) /* get prime factors */
|
||||
f=words(pf) /* number of prime factors */
|
||||
If f=1 Then /* If the number is prime */
|
||||
np=np+1 /* Then bump prime counter */
|
||||
If tell Then
|
||||
Say right(?,w) right('('f')',9) 'prime factors: ' tag.f pf
|
||||
End /*n*/
|
||||
Say ''
|
||||
ps='prime'
|
||||
If f>1 Then ps=ps's' /*setup For proper English in sentence.*/
|
||||
Say right(np, w+9+1) ps 'found.' /*display the number of primes found. */
|
||||
Exit /*stick a fork in it, we're all done. */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
factr: Procedure
|
||||
Parse Arg x 1 d,pl /*set X, D to argument 1, pl to null */
|
||||
If x==1 Then Return '' /*handle the special case of X=1. */
|
||||
primes=2 3 5 7 11 13 17 19 23
|
||||
Do While primes>'' /* first check the small primes */
|
||||
Parse Var primes prime primes
|
||||
Do While x//prime==0
|
||||
pl=pl prime
|
||||
x=x%prime
|
||||
End
|
||||
End
|
||||
r=isqrt(x)
|
||||
Do j=29 by 6 To r /*insure that J isn't divisible by 3.*/
|
||||
Parse var j '' -1 _ /*obtain the last decimal digit of J. */
|
||||
If _\==5 Then Do
|
||||
Do While x//j==0
|
||||
pl=pl j
|
||||
x=x%j
|
||||
End /*maybe reduce by J. */
|
||||
End
|
||||
If _ ==3 Then Iterate /*If next Y is divisible by 5? Skip. */
|
||||
y=j+2
|
||||
Do While x//y==0
|
||||
pl=pl y
|
||||
x=x%y
|
||||
End /*maybe reduce by y. */
|
||||
End /*j*/
|
||||
If x==1 Then Return pl /*Is residual=unity? Then don't append.*/
|
||||
Return pl x /*return pl with appended residual.*/
|
||||
|
||||
do j=29 by 6 to r /*insure that J isn't divisible by 3.*/ /* ◄■■■■ changed.*/
|
||||
parse var j '' -1 _ /*obtain the last decimal digit of J. */
|
||||
if _\==5 then do while x//j==0; $=$ j; x=x%j; end /*maybe reduce by J. */
|
||||
if _ ==3 then iterate /*Is next Y is divisible by 5? Skip.*/
|
||||
y=j+2; do while x//y==0; $=$ y; x=x%y; end /*maybe reduce by J. */
|
||||
end /*j*/
|
||||
/* [↓] The $ list has a leading blank.*/
|
||||
if x==1 then return $ /*Is residual=unity? Then don't append.*/
|
||||
return $ x /*return $ with appended residual. */
|
||||
isqrt: Procedure
|
||||
Parse Arg x
|
||||
x=abs(x)
|
||||
Parse Value 0 x with lo hi
|
||||
Do While lo<=hi
|
||||
t=(lo+hi)%2
|
||||
If t**2>x Then
|
||||
hi=t-1
|
||||
Else
|
||||
lo=t+1
|
||||
End
|
||||
Return t
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue