Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
3
Task/Semiprime/00-META.yaml
Normal file
3
Task/Semiprime/00-META.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
from: http://rosettacode.org/wiki/Semiprime
|
||||
note: Prime Numbers
|
||||
28
Task/Semiprime/00-TASK.txt
Normal file
28
Task/Semiprime/00-TASK.txt
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
Semiprime numbers are natural numbers that are products of exactly two (possibly equal) [[prime_number|prime numbers]].
|
||||
|
||||
|
||||
'''Semiprimes''' are also known as:
|
||||
:::* '''semi-primes'''
|
||||
:::* '''biprimes'''
|
||||
:::* '''bi-primes'''
|
||||
:::* ''' ''2-almost'' ''' primes
|
||||
:::* or simply: ''' ''P<sub>2</sub> '' '''
|
||||
|
||||
|
||||
|
||||
;Example:
|
||||
<big> 1679 = 23 × 73 </big>
|
||||
|
||||
(This particular number was chosen as the length of the [http://en.wikipedia.org/wiki/Arecibo_message Arecibo message]).
|
||||
|
||||
|
||||
;Task:
|
||||
Write a function determining whether a given number is semiprime.
|
||||
|
||||
|
||||
;See also:
|
||||
* The Wikipedia article: [[wp:Semiprime|semiprime]].
|
||||
* The Wikipedia article: [[wp:Almost_prime|almost prime]].
|
||||
* The OEIS sequence: [[oeis:A001358|A001358: semiprimes]] which has a shorter definition: ''the product of two primes''.
|
||||
<br><br>
|
||||
|
||||
12
Task/Semiprime/11l/semiprime.11l
Normal file
12
Task/Semiprime/11l/semiprime.11l
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
F is_semiprime(=c)
|
||||
V a = 2
|
||||
V b = 0
|
||||
L b < 3 & c != 1
|
||||
I c % a == 0
|
||||
c /= a
|
||||
b++
|
||||
E
|
||||
a++
|
||||
R b == 2
|
||||
|
||||
print((1..100).filter(n -> is_semiprime(n)))
|
||||
71
Task/Semiprime/360-Assembly/semiprime.360
Normal file
71
Task/Semiprime/360-Assembly/semiprime.360
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
* Semiprime 14/03/2017
|
||||
SEMIPRIM CSECT
|
||||
USING SEMIPRIM,R13 base register
|
||||
B 72(R15) skip savearea
|
||||
DC 17F'0' savearea
|
||||
STM R14,R12,12(R13) save previous context
|
||||
ST R13,4(R15) link backward
|
||||
ST R15,8(R13) link forward
|
||||
LR R13,R15 set addressability
|
||||
LA R10,PG pgi=0
|
||||
LA R8,0 m=0
|
||||
L R6,=F'2' i=2
|
||||
DO WHILE=(C,R6,LE,=F'100') do i=2 to 100
|
||||
ST R6,N n=i
|
||||
LA R9,0 f=0
|
||||
LA R7,2 j=2
|
||||
LOOPJ EQU * do j=2 while f<2 and j*j<=n
|
||||
C R9,=F'2' if f<2
|
||||
BNL EXITJ then exit do j
|
||||
LR R5,R7 j
|
||||
MR R4,R7 *j
|
||||
C R5,N if j*j<=n
|
||||
BH EXITJ then exit do j
|
||||
LOOPK EQU * do while n mod j=0
|
||||
L R4,N n
|
||||
SRDA R4,32 ~
|
||||
DR R4,R7 /j
|
||||
LTR R4,R4 if n mod <>0
|
||||
BNZ EXITK then exit do j
|
||||
ST R5,N n=n/j
|
||||
LA R9,1(R9) f=f+1
|
||||
B LOOPK enddo k
|
||||
EXITK LA R7,1(R7) j++
|
||||
B LOOPJ enddo j
|
||||
EXITJ L R4,N n
|
||||
IF C,R4,GT,=F'1' THEN if n>1 then
|
||||
LA R2,1 g=1
|
||||
ELSE , else
|
||||
LA R2,0 g=0
|
||||
ENDIF , endif
|
||||
AR R2,R9 +f
|
||||
IF C,R2,EQ,=F'2' THEN if f+(n>1)=2 then
|
||||
XDECO R6,XDEC edit i
|
||||
MVC 0(5,R10),XDEC+7 output i
|
||||
LA R10,5(R10) pgi=pgi+10
|
||||
LA R8,1(R8) m=m+1
|
||||
LR R4,R8 m
|
||||
SRDA R4,32 ~
|
||||
D R4,=F'16' m/16
|
||||
IF LTR,R4,Z,R4 THEN if m mod 16=0 then
|
||||
XPRNT PG,L'PG print buffer
|
||||
MVC PG,=CL80' ' clear buffer
|
||||
LA R10,PG pgi=0
|
||||
ENDIF , endif
|
||||
ENDIF , endif
|
||||
LA R6,1(R6) i++
|
||||
ENDDO , enddo i
|
||||
XPRNT PG,L'PG print buffer
|
||||
MVC PG,=CL80'..... semiprimes' init buffer
|
||||
XDECO R8,XDEC edit m
|
||||
MVC PG(5),XDEC+7 output m
|
||||
XPRNT PG,L'PG print buffer
|
||||
L R13,4(0,R13) restore previous savearea pointer
|
||||
LM R14,R12,12(R13) restore previous context
|
||||
XR R15,R15 rc=0
|
||||
BR R14 exit
|
||||
N DS F n
|
||||
PG DC CL80' ' buffer
|
||||
XDEC DS CL12 temp
|
||||
YREGS
|
||||
END SEMIPRIM
|
||||
38
Task/Semiprime/ALGOL-68/semiprime.alg
Normal file
38
Task/Semiprime/ALGOL-68/semiprime.alg
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
# returns TRUE if n is semi-prime, FALSE otherwise #
|
||||
# n is semi prime if it has exactly two prime factors #
|
||||
PROC is semiprime = ( INT n )BOOL:
|
||||
BEGIN
|
||||
# We only need to consider factors between 2 and #
|
||||
# sqrt( n ) inclusive. If there is only one of these #
|
||||
# then it must be a prime factor and so the number #
|
||||
# is semi prime #
|
||||
INT factor count := 0;
|
||||
FOR factor FROM 2 TO ENTIER sqrt( ABS n )
|
||||
WHILE IF n MOD factor = 0 THEN
|
||||
factor count +:= 1;
|
||||
# check the factor isn't a repeated factor #
|
||||
IF n /= factor * factor THEN
|
||||
# the factor isn't the square root #
|
||||
INT other factor = n OVER factor;
|
||||
IF other factor MOD factor = 0 THEN
|
||||
# have a repeated factor #
|
||||
factor count +:= 1
|
||||
FI
|
||||
FI
|
||||
FI;
|
||||
factor count < 2
|
||||
DO SKIP OD;
|
||||
factor count = 1
|
||||
END # is semiprime # ;
|
||||
|
||||
# determine the first few semi primes #
|
||||
print( ( "semi primes below 100: " ) );
|
||||
FOR i TO 99 DO
|
||||
IF is semi prime( i ) THEN print( ( whole( i, 0 ), " " ) ) FI
|
||||
OD;
|
||||
print( ( newline ) );
|
||||
print( ( "semi primes below between 1670 and 1690: " ) );
|
||||
FOR i FROM 1670 TO 1690 DO
|
||||
IF is semi prime( i ) THEN print( ( whole( i, 0 ), " " ) ) FI
|
||||
OD;
|
||||
print( ( newline ) )
|
||||
19
Task/Semiprime/ALGOL-W/semiprime.alg
Normal file
19
Task/Semiprime/ALGOL-W/semiprime.alg
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
begin % find some semi-primes - numbers with exactly 2 prime factors %
|
||||
logical procedure isSemiPrime( integer value v ) ;
|
||||
begin
|
||||
integer a, b, c;
|
||||
a := 2; b := 0; c := v;
|
||||
while b < 3 and c > 1 do begin
|
||||
if c rem a = 0 then begin
|
||||
c := c div a;
|
||||
b := b + 1
|
||||
end
|
||||
else a := a + 1;
|
||||
end while_b_lt_3_and_c_ne_1 ;
|
||||
b = 2
|
||||
end isSemiPrime ;
|
||||
|
||||
for x := 2 until 99 do begin
|
||||
if isSemiPrime( x ) then writeon( i_w := 1, s_w := 0, x, " " )
|
||||
end for_x
|
||||
end.
|
||||
23
Task/Semiprime/ASIC/semiprime.asic
Normal file
23
Task/Semiprime/ASIC/semiprime.asic
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
REM Semiprime
|
||||
PRINT "Enter an integer ";
|
||||
INPUT N
|
||||
N = ABS(N)
|
||||
|
||||
Count = 0
|
||||
IF N >= 2 THEN
|
||||
FOR Factor = 2 TO N
|
||||
NModFactor = N MOD Factor
|
||||
WHILE NModFactor = 0
|
||||
Count = Count + 1
|
||||
N = N / Factor
|
||||
NModFactor = N MOD Factor
|
||||
WEND
|
||||
NEXT Factor
|
||||
ENDIF
|
||||
|
||||
IF Count = 2 THEN
|
||||
PRINT "It is a semiprime."
|
||||
ELSE
|
||||
PRINT "It is not a semiprime."
|
||||
ENDIF
|
||||
END
|
||||
28
Task/Semiprime/AWK/semiprime.awk
Normal file
28
Task/Semiprime/AWK/semiprime.awk
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# syntax: GAWK -f SEMIPRIME.AWK
|
||||
BEGIN {
|
||||
main(0,100)
|
||||
main(1675,1680)
|
||||
exit(0)
|
||||
}
|
||||
function main(lo,hi, i) {
|
||||
printf("%d-%d:",lo,hi)
|
||||
for (i=lo; i<=hi; i++) {
|
||||
if (is_semiprime(i)) {
|
||||
printf(" %d",i)
|
||||
}
|
||||
}
|
||||
printf("\n")
|
||||
}
|
||||
function is_semiprime(n, i,nf) {
|
||||
nf = 0
|
||||
for (i=2; i<=n; i++) {
|
||||
while (n % i == 0) {
|
||||
if (nf == 2) {
|
||||
return(0)
|
||||
}
|
||||
nf++
|
||||
n /= i
|
||||
}
|
||||
}
|
||||
return(nf == 2)
|
||||
}
|
||||
28
Task/Semiprime/Action-/semiprime.action
Normal file
28
Task/Semiprime/Action-/semiprime.action
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
BYTE FUNC IsSemiPrime(INT n)
|
||||
INT a,b
|
||||
|
||||
a=2 b=0
|
||||
WHILE b<3 AND n#1
|
||||
DO
|
||||
IF n MOD a=0 THEN
|
||||
n==/a b==+1
|
||||
ELSE
|
||||
a==+1
|
||||
FI
|
||||
OD
|
||||
IF b=2 THEN
|
||||
RETURN(1)
|
||||
FI
|
||||
RETURN(0)
|
||||
|
||||
PROC Main()
|
||||
INT i
|
||||
|
||||
PrintE("Semiprimes:")
|
||||
FOR i=1 TO 500
|
||||
DO
|
||||
IF IsSemiPrime(i) THEN
|
||||
PrintI(i) Put(32)
|
||||
FI
|
||||
OD
|
||||
RETURN
|
||||
21
Task/Semiprime/Ada/semiprime.ada
Normal file
21
Task/Semiprime/Ada/semiprime.ada
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
with Prime_Numbers, Ada.Text_IO;
|
||||
|
||||
procedure Test_Semiprime is
|
||||
|
||||
package Integer_Numbers is new
|
||||
Prime_Numbers (Natural, 0, 1, 2);
|
||||
use Integer_Numbers;
|
||||
|
||||
begin
|
||||
for N in 1 .. 100 loop
|
||||
if Decompose(N)'Length = 2 then -- N is a semiprime;
|
||||
Ada.Text_IO.Put(Integer'Image(Integer(N)));
|
||||
end if;
|
||||
end loop;
|
||||
Ada.Text_IO.New_Line;
|
||||
for N in 1675 .. 1680 loop
|
||||
if Decompose(N)'Length = 2 then -- N is a semiprime;
|
||||
Ada.Text_IO.Put(Integer'Image(Integer(N)));
|
||||
end if;
|
||||
end loop;
|
||||
end Test_Semiprime;
|
||||
5
Task/Semiprime/Arturo/semiprime.arturo
Normal file
5
Task/Semiprime/Arturo/semiprime.arturo
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
semiPrime?: function [x][
|
||||
2 = size factors.prime x
|
||||
]
|
||||
|
||||
print select 1..100 => semiPrime?
|
||||
55
Task/Semiprime/AutoHotkey/semiprime.ahk
Normal file
55
Task/Semiprime/AutoHotkey/semiprime.ahk
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
SetBatchLines -1
|
||||
k := 1
|
||||
loop, 100
|
||||
{
|
||||
m := semiprime(k)
|
||||
StringSplit, m_m, m, -
|
||||
if ( m_m1 = "yes" )
|
||||
list .= k . " "
|
||||
k++
|
||||
}
|
||||
MsgBox % list
|
||||
list :=
|
||||
;===================================================================================================================================
|
||||
k := 1675
|
||||
loop, 5
|
||||
{
|
||||
m := semiprime(k)
|
||||
StringSplit, m_m, m, -
|
||||
if ( m_m1 = "yes" )
|
||||
list1 .= semiprime(k) . "`n"
|
||||
else
|
||||
list1 .= semiprime(k) . "`n"
|
||||
k++
|
||||
}
|
||||
MsgBox % list1
|
||||
list1 :=
|
||||
;===================================================================================================================================
|
||||
; The function==========================================================================================================================
|
||||
semiprime(k)
|
||||
{
|
||||
start := floor(sqrt(k))
|
||||
loop, % floor(sqrt(k)) - 1
|
||||
{
|
||||
if ( mod(k, start) = 0 )
|
||||
new .= floor(start) . "*" . floor(k//start) . ","
|
||||
start--
|
||||
}
|
||||
|
||||
StringSplit, index, new, `,
|
||||
|
||||
if ( index0 = 2 )
|
||||
{
|
||||
StringTrimRight, new, new, 1
|
||||
StringSplit, 2_ind, new, *
|
||||
if (mod(2_ind2, 2_ind1) = 0) && ( 2_ind1 != 2_ind2 )
|
||||
new := "N0- " . k . " - " . new
|
||||
else
|
||||
new := "yes- " . k . " - " . new
|
||||
}
|
||||
else
|
||||
new := "N0- " . k . " - " . new
|
||||
return new
|
||||
}
|
||||
;=================================================================================================================================================
|
||||
esc::Exitapp
|
||||
19
Task/Semiprime/BASIC256/semiprime.basic
Normal file
19
Task/Semiprime/BASIC256/semiprime.basic
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
function semiprime$ (n)
|
||||
a = 2
|
||||
c = 0
|
||||
while c < 3 and n > 1
|
||||
if (n mod a) = 0 then
|
||||
n = n / a
|
||||
c = c + 1
|
||||
else
|
||||
a = a + 1
|
||||
end if
|
||||
end while
|
||||
if c = 2 then return "True"
|
||||
return "False"
|
||||
end function
|
||||
|
||||
for i = 0 to 64
|
||||
print i, semiprime$(i)
|
||||
next i
|
||||
end
|
||||
7
Task/Semiprime/Bracmat/semiprime-1.bracmat
Normal file
7
Task/Semiprime/Bracmat/semiprime-1.bracmat
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
semiprime=
|
||||
m n a b
|
||||
. 2^-64:?m
|
||||
& 2*!m:?n
|
||||
& !arg^!m
|
||||
: (#%?a^!m*#%?b^!m|#%?a^!n&!a:?b)
|
||||
& (!a.!b);
|
||||
7
Task/Semiprime/Bracmat/semiprime-2.bracmat
Normal file
7
Task/Semiprime/Bracmat/semiprime-2.bracmat
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
2^63:?u
|
||||
& whl
|
||||
' ( -1+!u:>2:?u
|
||||
& ( semiprime$!u:?R&out$(!u ":" !R)
|
||||
|
|
||||
)
|
||||
);
|
||||
21
Task/Semiprime/C++/semiprime.cpp
Normal file
21
Task/Semiprime/C++/semiprime.cpp
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
#include <iostream>
|
||||
|
||||
bool isSemiPrime( int c )
|
||||
{
|
||||
int a = 2, b = 0;
|
||||
while( b < 3 && c != 1 )
|
||||
{
|
||||
if( !( c % a ) )
|
||||
{ c /= a; b++; }
|
||||
else a++;
|
||||
}
|
||||
return b == 2;
|
||||
}
|
||||
int main( int argc, char* argv[] )
|
||||
{
|
||||
for( int x = 2; x < 100; x++ )
|
||||
if( isSemiPrime( x ) )
|
||||
std::cout << x << " ";
|
||||
|
||||
return 0;
|
||||
}
|
||||
28
Task/Semiprime/C-sharp/semiprime.cs
Normal file
28
Task/Semiprime/C-sharp/semiprime.cs
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
static void Main(string[] args)
|
||||
{
|
||||
//test some numbers
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
Console.WriteLine("{0}\t{1} ", i,isSemiPrime(i));
|
||||
}
|
||||
Console.ReadLine();
|
||||
}
|
||||
|
||||
//returns true or false depending if input was considered semiprime
|
||||
private static bool isSemiPrime(int c)
|
||||
{
|
||||
int a = 2, b = 0;
|
||||
while (b < 3 && c != 1)
|
||||
{
|
||||
if ((c % a) == 0)
|
||||
{
|
||||
c /= a;
|
||||
b++;
|
||||
}
|
||||
else
|
||||
{
|
||||
a++;
|
||||
};
|
||||
}
|
||||
return b == 2;
|
||||
}
|
||||
21
Task/Semiprime/C/semiprime.c
Normal file
21
Task/Semiprime/C/semiprime.c
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int semiprime(int n)
|
||||
{
|
||||
int p, f = 0;
|
||||
for (p = 2; f < 2 && p*p <= n; p++)
|
||||
while (0 == n % p)
|
||||
n /= p, f++;
|
||||
|
||||
return f + (n > 1) == 2;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 2; i < 100; i++)
|
||||
if (semiprime(i)) printf(" %d", i);
|
||||
putchar('\n');
|
||||
|
||||
return 0;
|
||||
}
|
||||
14
Task/Semiprime/Chipmunk-Basic/semiprime.basic
Normal file
14
Task/Semiprime/Chipmunk-Basic/semiprime.basic
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
100 rem Semiprime
|
||||
110 cls
|
||||
120 for i = 0 to 64
|
||||
130 print using "## ";i semiprime$(i)
|
||||
140 next i
|
||||
150 end
|
||||
160 sub semiprime$(n)
|
||||
170 a = 2
|
||||
180 c = 0
|
||||
190 do while c < 3 and n > 1
|
||||
200 if n mod a = 0 then n = n/a : c = c+1 else a = a+1
|
||||
210 loop
|
||||
220 if c = 2 then semiprime$ = "True" else semiprime$ = "False"
|
||||
230 end sub
|
||||
14
Task/Semiprime/Clojure/semiprime.clj
Normal file
14
Task/Semiprime/Clojure/semiprime.clj
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
(ns example
|
||||
(:gen-class))
|
||||
|
||||
(defn semi-prime? [n]
|
||||
(loop [a 2
|
||||
b 0
|
||||
c n]
|
||||
(cond
|
||||
(> b 2) false
|
||||
(<= c 1) (= b 2)
|
||||
(= 0 (rem c a)) (recur a (inc b) (int (/ c a)))
|
||||
:else (recur (inc a) b c))))
|
||||
|
||||
(println (filter semi-prime? (range 1 100)))
|
||||
9
Task/Semiprime/Common-Lisp/semiprime.lisp
Normal file
9
Task/Semiprime/Common-Lisp/semiprime.lisp
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
(defun semiprimep (n &optional (a 2))
|
||||
(cond ((> a (isqrt n)) nil)
|
||||
((zerop (rem n a)) (and (primep a) (primep (/ n a))))
|
||||
(t (semiprimep n (+ a 1)))))
|
||||
|
||||
(defun primep (n &optional (a 2))
|
||||
(cond ((> a (isqrt n)) t)
|
||||
((zerop (rem n a)) nil)
|
||||
(t (primep n (+ a 1)))))
|
||||
13
Task/Semiprime/Crystal/semiprime-1.crystal
Normal file
13
Task/Semiprime/Crystal/semiprime-1.crystal
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
def semiprime(n)
|
||||
nf = 0
|
||||
(2..n).each do |i|
|
||||
while n % i == 0
|
||||
return false if nf == 2
|
||||
nf += 1
|
||||
n /= i
|
||||
end
|
||||
end
|
||||
nf == 2
|
||||
end
|
||||
|
||||
(1675..1681).each { |n| puts "#{n} -> #{semiprime(n)}" }
|
||||
5
Task/Semiprime/Crystal/semiprime-2.crystal
Normal file
5
Task/Semiprime/Crystal/semiprime-2.crystal
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
def semiprime(n)
|
||||
`factor #{n}`.split(' ').size == 3
|
||||
end
|
||||
n = 0xffffffffffffffff_u64 # 2**64 - 1 = 18446744073709551615
|
||||
(n-50..n).each { |n| puts "#{n} -> #{semiprime(n)}" }
|
||||
19
Task/Semiprime/D/semiprime.d
Normal file
19
Task/Semiprime/D/semiprime.d
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
bool semiprime(long n) pure nothrow @safe @nogc {
|
||||
auto nf = 0;
|
||||
foreach (immutable i; 2 .. n + 1) {
|
||||
while (n % i == 0) {
|
||||
if (nf == 2)
|
||||
return false;
|
||||
nf++;
|
||||
n /= i;
|
||||
}
|
||||
}
|
||||
return nf == 2;
|
||||
}
|
||||
|
||||
void main() {
|
||||
import std.stdio;
|
||||
|
||||
foreach (immutable n; 1675 .. 1681)
|
||||
writeln(n, " -> ", n.semiprime);
|
||||
}
|
||||
48
Task/Semiprime/DCL/semiprime.dcl
Normal file
48
Task/Semiprime/DCL/semiprime.dcl
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
$ p1 = f$integer( p1 )
|
||||
$ if p1 .lt. 2
|
||||
$ then
|
||||
$ write sys$output "out of range 2 thru 2^31-1"
|
||||
$ exit
|
||||
$ endif
|
||||
$
|
||||
$ close /nolog primes
|
||||
$ on control_y then $ goto clean
|
||||
$ open primes primes.txt
|
||||
$
|
||||
$ loop1:
|
||||
$ read /end_of_file = prime primes prime
|
||||
$ prime = f$integer( prime )
|
||||
$ loop2:
|
||||
$ t = p1 / prime
|
||||
$ if t * prime .eq. p1
|
||||
$ then
|
||||
$ if f$type( factorization ) .eqs. ""
|
||||
$ then
|
||||
$ factorization = f$string( prime )
|
||||
$ else
|
||||
$ factorization = factorization + "*" + f$string( prime )
|
||||
$ endif
|
||||
$ if t .eq. 1 then $ goto done
|
||||
$ p1 = t
|
||||
$ goto loop2
|
||||
$ else
|
||||
$ goto loop1
|
||||
$ endif
|
||||
$ prime:
|
||||
$ if f$type( factorization ) .eqs. ""
|
||||
$ then
|
||||
$ factorization = f$string( p1 )
|
||||
$ else
|
||||
$ factorization = factorization + "*" + f$string( p1 )
|
||||
$ endif
|
||||
$ done:
|
||||
$ show symbol factorization
|
||||
$ if f$locate( "*", factorization ) .eq. f$length( factorization )
|
||||
$ then
|
||||
$ write sys$output "so, it is prime"
|
||||
$ else
|
||||
$ if f$element( 2, "*", factorization ) .eqs. "*" then $ write sys$output "so, it is semiprime"
|
||||
$ endif
|
||||
$
|
||||
$ clean:
|
||||
$ close primes
|
||||
48
Task/Semiprime/Delphi/semiprime.delphi
Normal file
48
Task/Semiprime/Delphi/semiprime.delphi
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
{This function would normally be in a library, but it shown here for clarity}
|
||||
|
||||
procedure GetAllFactors(N: Integer;var IA: TIntegerDynArray);
|
||||
{Make a list of all irreducible factor of N}
|
||||
var I: integer;
|
||||
begin
|
||||
SetLength(IA,1);
|
||||
IA[0]:=1;
|
||||
for I:=2 to N do
|
||||
while (N mod I)=0 do
|
||||
begin
|
||||
SetLength(IA,Length(IA)+1);
|
||||
IA[High(IA)]:=I;
|
||||
N:=N div I;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function IsSemiprime(N: integer): boolean;
|
||||
{Test if number is semiprime}
|
||||
var IA: TIntegerDynArray;
|
||||
begin
|
||||
{Get all factors of N}
|
||||
GetAllFactors(N,IA);
|
||||
Result:=False;
|
||||
{Since 1 is factor, ignore it}
|
||||
if Length(IA)<>3 then exit;
|
||||
Result:=IsPrime(IA[1]) and IsPrime(IA[2]);
|
||||
end;
|
||||
|
||||
|
||||
procedure Semiprimes(Memo: TMemo);
|
||||
var I,Cnt: integer;
|
||||
var S: string;
|
||||
begin
|
||||
Cnt:=0;
|
||||
S:='';
|
||||
{Test first 100 number to see if they are semiprime}
|
||||
for I:=0 to 100-1 do
|
||||
if IsSemiprime(I) then
|
||||
begin
|
||||
Inc(Cnt);
|
||||
S:=S+Format('%4d',[I]);
|
||||
if (Cnt mod 10)= 0 then S:=S+CRLF;
|
||||
end;
|
||||
Memo.Lines.Add(S);
|
||||
Memo.Lines.Add('Count='+IntToStr(Cnt));
|
||||
end;
|
||||
26
Task/Semiprime/ERRE/semiprime.erre
Normal file
26
Task/Semiprime/ERRE/semiprime.erre
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
PROGRAM SEMIPRIME_NUMBER
|
||||
|
||||
!VAR I%
|
||||
|
||||
PROCEDURE SEMIPRIME(N%->RESULT%)
|
||||
LOCAL F%,P%
|
||||
P%=2
|
||||
LOOP
|
||||
EXIT IF NOT(F%<2 AND P%*P%<=N%)
|
||||
WHILE (N% MOD P%)=0 DO
|
||||
N%=N% DIV P%
|
||||
F%+=1
|
||||
END WHILE
|
||||
P%+=1
|
||||
END LOOP
|
||||
RESULT%=F%-(N%>1)=2
|
||||
END PROCEDURE
|
||||
|
||||
BEGIN
|
||||
PRINT(CHR$(12);) !CLS
|
||||
FOR I%=2 TO 100 DO
|
||||
SEMIPRIME(I%->RESULT%)
|
||||
IF RESULT% THEN PRINT(I%;) END IF
|
||||
END FOR
|
||||
PRINT
|
||||
END PROGRAM
|
||||
20
Task/Semiprime/EchoLisp/semiprime.l
Normal file
20
Task/Semiprime/EchoLisp/semiprime.l
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
(lib 'math)
|
||||
(define (semi-prime? n)
|
||||
(= (length (prime-factors n)) 2))
|
||||
|
||||
(for ((i 100))
|
||||
(when (semi-prime? i) (write i)))
|
||||
|
||||
4 6 9 10 14 15 21 22 25 26 33 34 35 38 39 46 49 51 55 57 58 62 65 69 74 77 82 85 86 87 91 93 94 95
|
||||
|
||||
(lib 'bigint)
|
||||
(define N (* (random-prime 10000000) (random-prime 10000000)))
|
||||
→ 6764578882969
|
||||
(semi-prime? N)
|
||||
→ #t
|
||||
|
||||
;; a pair n,n+1 of semi-primes
|
||||
(prime-factors 100000000041)
|
||||
→ (3 33333333347)
|
||||
(prime-factors 100000000042)
|
||||
→ (2 50000000021)
|
||||
14
Task/Semiprime/Elixir/semiprime.elixir
Normal file
14
Task/Semiprime/Elixir/semiprime.elixir
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
defmodule Prime do
|
||||
def semiprime?(n), do: length(decomposition(n)) == 2
|
||||
|
||||
def decomposition(n), do: decomposition(n, 2, [])
|
||||
|
||||
defp decomposition(n, k, acc) when n < k*k, do: Enum.reverse(acc, [n])
|
||||
defp decomposition(n, k, acc) when rem(n, k) == 0, do: decomposition(div(n, k), k, [k | acc])
|
||||
defp decomposition(n, k, acc), do: decomposition(n, k+1, acc)
|
||||
end
|
||||
|
||||
IO.inspect Enum.filter(1..100, &Prime.semiprime?(&1))
|
||||
Enum.each(1675..1680, fn n ->
|
||||
:io.format "~w -> ~w\t~s~n", [n, Prime.semiprime?(n), Prime.decomposition(n)|>Enum.join(" x ")]
|
||||
end)
|
||||
19
Task/Semiprime/Erlang/semiprime.erl
Normal file
19
Task/Semiprime/Erlang/semiprime.erl
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
-module(factors).
|
||||
-export([factors/1,kthfactor/2]).
|
||||
|
||||
factors(N) ->
|
||||
factors(N,2,[]).
|
||||
|
||||
factors(1,_,Acc) -> Acc;
|
||||
factors(N,K,Acc) when N rem K == 0 ->
|
||||
factors(N div K,K, [K|Acc]);
|
||||
factors(N,K,Acc) ->
|
||||
factors(N,K+1,Acc).
|
||||
|
||||
|
||||
% is integer N factorable into M primes?
|
||||
kthfactor(N,M) ->
|
||||
case length(factors(N)) of M ->
|
||||
factors(N);
|
||||
_ ->
|
||||
false end.
|
||||
15
Task/Semiprime/F-Sharp/semiprime.fs
Normal file
15
Task/Semiprime/F-Sharp/semiprime.fs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
let isSemiprime (n: int) =
|
||||
let rec loop currentN candidateFactor numberOfFactors =
|
||||
if numberOfFactors > 2 then numberOfFactors
|
||||
elif currentN = candidateFactor then numberOfFactors+1
|
||||
elif currentN % candidateFactor = 0 then loop (currentN/candidateFactor) candidateFactor (numberOfFactors+1)
|
||||
else loop currentN (candidateFactor+1) numberOfFactors
|
||||
if n < 2 then false else 2 = loop n 2 0
|
||||
|
||||
seq { 1 .. 100 } |> Seq.choose (fun n -> if isSemiprime n then Some(n) else None)
|
||||
|> Seq.toList |> printfn "%A"
|
||||
|
||||
seq { 1675 .. 1680 }
|
||||
|> Seq.choose (fun n -> if isSemiprime n then Some(n) else None)
|
||||
|> Seq.toList
|
||||
|> printfn "%A"
|
||||
3
Task/Semiprime/Factor/semiprime-1.factor
Normal file
3
Task/Semiprime/Factor/semiprime-1.factor
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
USING: io kernel math.primes.factors prettyprint sequences ;
|
||||
|
||||
: semiprime? ( n -- ? ) factors length 2 = ;
|
||||
1
Task/Semiprime/Factor/semiprime-2.factor
Normal file
1
Task/Semiprime/Factor/semiprime-2.factor
Normal file
|
|
@ -0,0 +1 @@
|
|||
100 <iota> [ semiprime? ] filter [ bl ] [ pprint ] interleave nl
|
||||
8
Task/Semiprime/Forth/semiprime.fth
Normal file
8
Task/Semiprime/Forth/semiprime.fth
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
: semiprime?
|
||||
0 swap dup 2 do
|
||||
begin dup i mod 0= while i / swap 1+ swap repeat
|
||||
over 1 > over i dup * < or if leave then
|
||||
loop 1 > abs + 2 =
|
||||
;
|
||||
|
||||
: test 100 2 do i semiprime? if i . then loop cr ;
|
||||
17
Task/Semiprime/FreeBASIC/semiprime.basic
Normal file
17
Task/Semiprime/FreeBASIC/semiprime.basic
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
function semiprime( n as uinteger ) as boolean
|
||||
dim as uinteger a = 2, c = 0
|
||||
while c < 3 andalso n > 1
|
||||
if n mod a = 0 then
|
||||
n /= a
|
||||
c += 1
|
||||
else
|
||||
a += 1
|
||||
end if
|
||||
wend
|
||||
if c = 2 then return true
|
||||
return false
|
||||
end function
|
||||
|
||||
for i as uinteger = 0 to 64
|
||||
print i, semiprime(i)
|
||||
next i
|
||||
1
Task/Semiprime/Frink/semiprime.frink
Normal file
1
Task/Semiprime/Frink/semiprime.frink
Normal file
|
|
@ -0,0 +1 @@
|
|||
isSemiprime[n] := length[factorFlat[n]] == 2
|
||||
8
Task/Semiprime/GW-BASIC/semiprime.basic
Normal file
8
Task/Semiprime/GW-BASIC/semiprime.basic
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
10 INPUT "Enter a number: ", N
|
||||
20 N=ABS(N)
|
||||
30 C = 0
|
||||
40 IF N < 3 THEN GOTO 80
|
||||
50 F = 2
|
||||
60 IF N MOD F = 0 THEN C = C + 1 : N = N / F ELSE F = F + 1
|
||||
70 IF N > 1 THEN GOTO 60
|
||||
80 IF C=2 THEN PRINT "It's a semiprime." ELSE PRINT "It is not a semiprime."
|
||||
23
Task/Semiprime/Go/semiprime.go
Normal file
23
Task/Semiprime/Go/semiprime.go
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func semiprime(n int) bool {
|
||||
nf := 0
|
||||
for i := 2; i <= n; i++ {
|
||||
for n%i == 0 {
|
||||
if nf == 2 {
|
||||
return false
|
||||
}
|
||||
nf++
|
||||
n /= i
|
||||
}
|
||||
}
|
||||
return nf == 2
|
||||
}
|
||||
|
||||
func main() {
|
||||
for v := 1675; v <= 1680; v++ {
|
||||
fmt.Println(v, "->", semiprime(v))
|
||||
}
|
||||
}
|
||||
4
Task/Semiprime/Haskell/semiprime-1.hs
Normal file
4
Task/Semiprime/Haskell/semiprime-1.hs
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
isSemiprime :: Int -> Bool
|
||||
isSemiprime n = (length factors) == 2 && (product factors) == n ||
|
||||
(length factors) == 1 && (head factors) ^ 2 == n
|
||||
where factors = primeFactors n
|
||||
4
Task/Semiprime/Haskell/semiprime-2.hs
Normal file
4
Task/Semiprime/Haskell/semiprime-2.hs
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
isSemiprime :: Int -> Bool
|
||||
isSemiprime n = case (primeFactors n) of
|
||||
[f1, f2] -> f1 * f2 == n
|
||||
otherwise -> False
|
||||
9
Task/Semiprime/Icon/semiprime.icon
Normal file
9
Task/Semiprime/Icon/semiprime.icon
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
link "factors"
|
||||
|
||||
procedure main(A)
|
||||
every nf := semiprime(n := !A) do write(n," = ",nf[1]," * ",nf[2])
|
||||
end
|
||||
|
||||
procedure semiprime(n) # Succeeds and produces the factors only if n is semiprime.
|
||||
return (2 = *(nf := factors(n)), nf)
|
||||
end
|
||||
1
Task/Semiprime/J/semiprime-1.j
Normal file
1
Task/Semiprime/J/semiprime-1.j
Normal file
|
|
@ -0,0 +1 @@
|
|||
isSemiPrime=: 2 = #@q: ::0:"0
|
||||
2
Task/Semiprime/J/semiprime-2.j
Normal file
2
Task/Semiprime/J/semiprime-2.j
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
I. isSemiPrime i.100
|
||||
4 6 9 10 14 15 21 22 25 26 33 34 35 38 39 46 49 51 55 57 58 62 65 69 74 77 82 85 86 87 91 93 94 95
|
||||
57
Task/Semiprime/Java/semiprime.java
Normal file
57
Task/Semiprime/Java/semiprime.java
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
import java.math.BigInteger;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SemiPrime{
|
||||
private static final BigInteger TWO = BigInteger.valueOf(2);
|
||||
|
||||
public static List<BigInteger> primeDecomp(BigInteger a){
|
||||
// impossible for values lower than 2
|
||||
if(a.compareTo(TWO) < 0){
|
||||
return null;
|
||||
}
|
||||
|
||||
//quickly handle even values
|
||||
List<BigInteger> result = new ArrayList<BigInteger>();
|
||||
while(a.and(BigInteger.ONE).equals(BigInteger.ZERO)){
|
||||
a = a.shiftRight(1);
|
||||
result.add(TWO);
|
||||
}
|
||||
|
||||
//left with odd values
|
||||
if(!a.equals(BigInteger.ONE)){
|
||||
BigInteger b = BigInteger.valueOf(3);
|
||||
while(b.compareTo(a) < 0){
|
||||
if(b.isProbablePrime(10)){
|
||||
BigInteger[] dr = a.divideAndRemainder(b);
|
||||
if(dr[1].equals(BigInteger.ZERO)){
|
||||
result.add(b);
|
||||
a = dr[0];
|
||||
}
|
||||
}
|
||||
b = b.add(TWO);
|
||||
}
|
||||
result.add(b); //b will always be prime here...
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static boolean isSemi(BigInteger x){
|
||||
List<BigInteger> decomp = primeDecomp(x);
|
||||
return decomp != null && decomp.size() == 2;
|
||||
}
|
||||
|
||||
public static void main(String[] args){
|
||||
for(int i = 2; i <= 100; i++){
|
||||
if(isSemi(BigInteger.valueOf(i))){
|
||||
System.out.print(i + " ");
|
||||
}
|
||||
}
|
||||
System.out.println();
|
||||
for(int i = 1675; i <= 1680; i++){
|
||||
if(isSemi(BigInteger.valueOf(i))){
|
||||
System.out.print(i + " ");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
10
Task/Semiprime/Jq/semiprime-1.jq
Normal file
10
Task/Semiprime/Jq/semiprime-1.jq
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
def is_semiprime:
|
||||
{i: 2, n: ., nf: 0}
|
||||
| until( .i > .n or .result;
|
||||
until(.n % .i != 0 or .result;
|
||||
if .nf == 2 then .result = 0
|
||||
else .nf += 1
|
||||
| .n /= .i
|
||||
end)
|
||||
| .i += 1)
|
||||
| if .result == 0 then false else .nf == 2 end;
|
||||
1
Task/Semiprime/Jq/semiprime-2.jq
Normal file
1
Task/Semiprime/Jq/semiprime-2.jq
Normal file
|
|
@ -0,0 +1 @@
|
|||
(1679, 1680) | "\(.) => \(is_semiprime)"
|
||||
3
Task/Semiprime/Julia/semiprime.julia
Normal file
3
Task/Semiprime/Julia/semiprime.julia
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
using Primes
|
||||
issemiprime(n::Integer) = sum(values(factor(n))) == 2
|
||||
@show filter(issemiprime, 1:100)
|
||||
18
Task/Semiprime/Kotlin/semiprime.kotlin
Normal file
18
Task/Semiprime/Kotlin/semiprime.kotlin
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
// version 1.1.2
|
||||
|
||||
fun isSemiPrime(n: Int): Boolean {
|
||||
var nf = 0
|
||||
var nn = n
|
||||
for (i in 2..nn)
|
||||
while (nn % i == 0) {
|
||||
if (nf == 2) return false
|
||||
nf++
|
||||
nn /= i
|
||||
}
|
||||
return nf == 2
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
for (v in 1675..1680)
|
||||
println("$v ${if (isSemiPrime(v)) "is" else "isn't"} semi-prime")
|
||||
}
|
||||
35
Task/Semiprime/Ksh/semiprime.ksh
Normal file
35
Task/Semiprime/Ksh/semiprime.ksh
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
#!/bin/ksh
|
||||
|
||||
# Semiprime - As translated from C
|
||||
|
||||
# # Variables:
|
||||
#
|
||||
|
||||
# # Functions:
|
||||
#
|
||||
# Function _issemiprime(p2) - return 1 if p2 semiprime, 0 if not
|
||||
#
|
||||
function _issemiprime {
|
||||
typeset _p2 ; integer _p2=$1
|
||||
typeset _p _f ; integer _p _f=0
|
||||
|
||||
for ((_p=2; (_f<2 && _p*_p<=_p2); _p++)); do
|
||||
while (( _p2 % _p == 0 )); do
|
||||
(( _p2 /= _p ))
|
||||
(( _f++ ))
|
||||
done
|
||||
done
|
||||
|
||||
return $(( _f + (_p2 > 1) == 2 ))
|
||||
}
|
||||
|
||||
######
|
||||
# main #
|
||||
######
|
||||
|
||||
integer i
|
||||
for ((i=2; i<100; i++)); do
|
||||
_issemiprime ${i}
|
||||
(( $? )) && printf " %d" ${i}
|
||||
done
|
||||
echo
|
||||
65
Task/Semiprime/Lambdatalk/semiprime.lambdatalk
Normal file
65
Task/Semiprime/Lambdatalk/semiprime.lambdatalk
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
{def factors
|
||||
{def factors.r
|
||||
{lambda {:n :i}
|
||||
{if {> :i :n}
|
||||
then
|
||||
else {if {= {% :n :i} 0}
|
||||
then :i {factors.r {/ :n :i} :i}
|
||||
else {factors.r :n {+ :i 1}} }}}}
|
||||
{lambda {:n}
|
||||
{A.new {factors.r :n 2} }}}
|
||||
-> factors
|
||||
|
||||
{factors 491} -> [491] // prime
|
||||
{factors 492} -> [2,2,3,41]
|
||||
{factors 493} -> [17,29] // semiprime
|
||||
{factors 494} -> [2,13,19]
|
||||
{factors 495} -> [3,3,5,11]
|
||||
{factors 496} -> [2,2,2,2,31]
|
||||
{factors 497} -> [7,71] // semiprime
|
||||
{factors 498} -> [2,3,83]
|
||||
{factors 499} -> [499] // prime
|
||||
{factors 500} -> [2,2,5,5,5]
|
||||
|
||||
{S.replace \s by space in
|
||||
{S.map {lambda {:i}
|
||||
{let { {:i :i} {:f {factors :i}}
|
||||
} {if {= {A.length :f} 2}
|
||||
then :i={A.first :f}*{A.last :f}
|
||||
else}} }
|
||||
{S.serie 1 100}}}
|
||||
->
|
||||
4 = 2*2
|
||||
6 = 2*3
|
||||
9 = 3*3
|
||||
10 = 2*5
|
||||
14 = 2*7
|
||||
15 = 3*5
|
||||
21 = 3*7
|
||||
22 = 2*11
|
||||
25 = 5*5
|
||||
26 = 2*13
|
||||
33 = 3*11
|
||||
34 = 2*17
|
||||
35 = 5*7
|
||||
38 = 2*19
|
||||
39 = 3*13
|
||||
46 = 2*23
|
||||
49 = 7*7
|
||||
51 = 3*17
|
||||
55 = 5*11
|
||||
57 = 3*19
|
||||
58 = 2*29
|
||||
62 = 2*31
|
||||
65 = 5*13
|
||||
69 = 3*23
|
||||
74 = 2*37
|
||||
77 = 7*11
|
||||
82 = 2*41
|
||||
85 = 5*17
|
||||
86 = 2*43
|
||||
87 = 3*29
|
||||
91 = 7*13
|
||||
93 = 3*31
|
||||
94 = 2*47
|
||||
95 = 5*19
|
||||
13
Task/Semiprime/Lingo/semiprime-1.lingo
Normal file
13
Task/Semiprime/Lingo/semiprime-1.lingo
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
on isSemiPrime (n)
|
||||
div = 2
|
||||
cnt = 0
|
||||
repeat while cnt < 3 and n <> 1
|
||||
if n mod div = 0 then
|
||||
n = n / div
|
||||
cnt = cnt + 1
|
||||
else
|
||||
div = div + 1
|
||||
end if
|
||||
end repeat
|
||||
return cnt=2
|
||||
end
|
||||
5
Task/Semiprime/Lingo/semiprime-2.lingo
Normal file
5
Task/Semiprime/Lingo/semiprime-2.lingo
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
res = []
|
||||
repeat with i = 1 to 100
|
||||
if isSemiPrime(i) then res.add(i)
|
||||
end repeat
|
||||
put res
|
||||
16
Task/Semiprime/Lua/semiprime.lua
Normal file
16
Task/Semiprime/Lua/semiprime.lua
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
function semiprime (n)
|
||||
local divisor, count = 2, 0
|
||||
while count < 3 and n ~= 1 do
|
||||
if n % divisor == 0 then
|
||||
n = n / divisor
|
||||
count = count + 1
|
||||
else
|
||||
divisor = divisor + 1
|
||||
end
|
||||
end
|
||||
return count == 2
|
||||
end
|
||||
|
||||
for n = 1675, 1680 do
|
||||
print(n, semiprime(n))
|
||||
end
|
||||
10
Task/Semiprime/Maple/semiprime-1.maple
Normal file
10
Task/Semiprime/Maple/semiprime-1.maple
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
SemiPrimes := proc( n )
|
||||
local fact;
|
||||
fact := NumberTheory:-Divisors( n ) minus {1, n};
|
||||
if numelems( fact ) in {1,2} and not( member( 'false', isprime ~ ( fact ) ) ) then
|
||||
return n;
|
||||
else
|
||||
return NULL;
|
||||
end if;
|
||||
end proc:
|
||||
{ seq( SemiPrimes( i ), i = 1..100 ) };
|
||||
1
Task/Semiprime/Maple/semiprime-2.maple
Normal file
1
Task/Semiprime/Maple/semiprime-2.maple
Normal file
|
|
@ -0,0 +1 @@
|
|||
{ 4,6,9,10,14,15,21,22,25,26,33,34,35,38,39,46,49,51,55,57,58,62,65,69,74,77,82,85,86,87,91,93,94,95 }
|
||||
5
Task/Semiprime/Mathematica/semiprime-1.math
Normal file
5
Task/Semiprime/Mathematica/semiprime-1.math
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
semiPrimeQ[n_Integer] := Module[{factors, numfactors},
|
||||
factors = FactorInteger[n] // Transpose;
|
||||
numfactors = factors[[2]] // Total ;
|
||||
numfactors == 2
|
||||
]
|
||||
2
Task/Semiprime/Mathematica/semiprime-2.math
Normal file
2
Task/Semiprime/Mathematica/semiprime-2.math
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
semiPrimeQ[#] & /@ Range[100];
|
||||
Position[%, True] // Flatten
|
||||
20
Task/Semiprime/MiniScript/semiprime.mini
Normal file
20
Task/Semiprime/MiniScript/semiprime.mini
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
isSemiprime = function(num)
|
||||
divisor = 2
|
||||
primes = 0
|
||||
while primes < 3 and num != 1
|
||||
if num % divisor == 0 then
|
||||
num = num / divisor;
|
||||
primes = primes + 1
|
||||
else
|
||||
divisor = divisor + 1
|
||||
end if
|
||||
end while
|
||||
return primes == 2
|
||||
end function
|
||||
|
||||
print "Semiprimes up to 100:"
|
||||
results = []
|
||||
for i in range(2, 100)
|
||||
if isSemiprime(i) then results.push i
|
||||
end for
|
||||
print results
|
||||
17
Task/Semiprime/Minimal-BASIC/semiprime.basic
Normal file
17
Task/Semiprime/Minimal-BASIC/semiprime.basic
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
10 REM Semiprime
|
||||
20 PRINT "Enter an integer";
|
||||
30 INPUT N
|
||||
40 LET N = ABS(N)
|
||||
50 LET C = 0
|
||||
60 IF N < 2 THEN 130
|
||||
70 FOR F = 2 TO N
|
||||
80 IF INT(N/F)*F <> N THEN 120
|
||||
90 LET C = C+1
|
||||
100 LET N = N/F
|
||||
110 GOTO 80
|
||||
120 NEXT F
|
||||
130 IF C <> 2 THEN 160
|
||||
140 PRINT "It is a semiprime."
|
||||
150 GOTO 170
|
||||
160 PRINT "It is not a semiprime."
|
||||
170 END
|
||||
9
Task/Semiprime/NewLISP/semiprime.l
Normal file
9
Task/Semiprime/NewLISP/semiprime.l
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
;;; Practically identical to the EchoLisp solution
|
||||
(define (semiprime? n)
|
||||
(= (length (factor n)) 2))
|
||||
;
|
||||
;;; Example (sadly factor doesn't accept bigints)
|
||||
(println (filter semiprime? (sequence 2 100)))
|
||||
(setq x 9223372036854775807)
|
||||
(while (not (semiprime? x)) (-- x))
|
||||
(println "Biggest semiprime reachable: " x " = " ((factor x) 0) " x " ((factor x) 1))
|
||||
15
Task/Semiprime/Nim/semiprime.nim
Normal file
15
Task/Semiprime/Nim/semiprime.nim
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
proc isSemiPrime(k: int): bool =
|
||||
var
|
||||
i = 2
|
||||
count = 0
|
||||
x = k
|
||||
while i <= x and count < 3:
|
||||
if x mod i == 0:
|
||||
x = x div i
|
||||
inc count
|
||||
else:
|
||||
inc i
|
||||
result = count == 2
|
||||
|
||||
for k in 1675..1680:
|
||||
echo k, (if k.isSemiPrime(): " is" else: " isn’t"), " semi-prime"
|
||||
25
Task/Semiprime/Objeck/semiprime.objeck
Normal file
25
Task/Semiprime/Objeck/semiprime.objeck
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
class SemiPrime {
|
||||
function : Main(args : String[]) ~ Nil {
|
||||
for(i := 0; i < 100; i+=1;) {
|
||||
if(SemiPrime(i)) {
|
||||
"{$i} "->Print();
|
||||
};
|
||||
};
|
||||
IO.Console->PrintLine();
|
||||
}
|
||||
|
||||
function : native : SemiPrime(n : Int) ~ Bool {
|
||||
nf := 0;
|
||||
for(i := 2; i <= n; i+=1;) {
|
||||
while(n%i = 0) {
|
||||
if(nf = 2) {
|
||||
return false;
|
||||
};
|
||||
nf+=1;
|
||||
n /= i;
|
||||
};
|
||||
};
|
||||
|
||||
return nf = 2;
|
||||
}
|
||||
}
|
||||
4
Task/Semiprime/Oforth/semiprime.fth
Normal file
4
Task/Semiprime/Oforth/semiprime.fth
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
func: semiprime(n)
|
||||
| i |
|
||||
0 2 n sqrt asInteger for: i [ while(n i /mod swap 0 &=) [ ->n 1+ ] drop ]
|
||||
n 1 > ifTrue: [ 1+ ] 2 == ;
|
||||
1
Task/Semiprime/PARI-GP/semiprime-1.parigp
Normal file
1
Task/Semiprime/PARI-GP/semiprime-1.parigp
Normal file
|
|
@ -0,0 +1 @@
|
|||
issemi(n)=bigomega(n)==2
|
||||
5
Task/Semiprime/PARI-GP/semiprime-2.parigp
Normal file
5
Task/Semiprime/PARI-GP/semiprime-2.parigp
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
issemi(n)={
|
||||
forprime(p=2,97,if(n%p==0, return(isprime(n/p))));
|
||||
if(isprime(n), return(0));
|
||||
bigomega(n)==2
|
||||
};
|
||||
77
Task/Semiprime/PARI-GP/semiprime-3.parigp
Normal file
77
Task/Semiprime/PARI-GP/semiprime-3.parigp
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
long
|
||||
issemiprime(GEN n)
|
||||
{
|
||||
if (typ(n) != t_INT)
|
||||
pari_err_TYPE("issemiprime", n);
|
||||
if (signe(n) <= 0)
|
||||
return 0;
|
||||
|
||||
ulong nn = itou_or_0(n);
|
||||
if (nn)
|
||||
return uissemiprime(nn);
|
||||
|
||||
pari_sp ltop = avma;
|
||||
if (!mpodd(n)) {
|
||||
long ret = mod4(n) && isprime(shifti(n, -1));
|
||||
avma = ltop;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
long p;
|
||||
forprime_t primepointer;
|
||||
u_forprime_init(&primepointer, 3, 997);
|
||||
while ((p = u_forprime_next(&primepointer))) {
|
||||
if (dvdis(n, p)) {
|
||||
long ret = isprime(diviuexact(n, p));
|
||||
avma = ltop;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (isprime(n))
|
||||
return 0;
|
||||
|
||||
if (DEBUGLEVEL > 3)
|
||||
pari_printf("issemi: Number is a composite with no small prime factors; using general factoring mechanisms.");
|
||||
|
||||
GEN fac = Z_factor_until(n, shifti(n, -1)); /* Find a nontrivial factor -- returns just the factored part */
|
||||
GEN expo = gel(fac, 2);
|
||||
GEN pr = gel(fac, 1);
|
||||
long len = glength(expo);
|
||||
if (len > 2) {
|
||||
avma = ltop;
|
||||
return 0;
|
||||
}
|
||||
if (len == 2) {
|
||||
if (cmpis(gel(expo, 1), 1) > 0 || cmpis(gel(expo, 2), 1) > 0) {
|
||||
avma = ltop;
|
||||
return 0;
|
||||
}
|
||||
GEN P = gel(pr, 1);
|
||||
GEN Q = gel(pr, 2);
|
||||
long ret = isprime(P) && isprime(Q) && equalii(mulii(P, Q), n);
|
||||
avma = ltop;
|
||||
return ret;
|
||||
}
|
||||
if (len == 1) {
|
||||
long e = itos(gel(expo, 1));
|
||||
if (e == 2) {
|
||||
GEN P = gel(pr, 1);
|
||||
long ret = isprime(P) && equalii(sqri(P), n);
|
||||
avma = ltop;
|
||||
return ret;
|
||||
} else if (e > 2) {
|
||||
avma = ltop;
|
||||
return 0;
|
||||
}
|
||||
GEN P = gel(pr, 1);
|
||||
long ret = isprime(P) && isprime(diviiexact(n, P));
|
||||
avma = ltop;
|
||||
return ret;
|
||||
}
|
||||
|
||||
pari_err_BUG(pari_sprintf("Z_factor_until returned an unexpected value %Ps at n = %Ps, exiting...", fac, n));
|
||||
avma = ltop;
|
||||
return 0; /* never used */
|
||||
}
|
||||
21
Task/Semiprime/PHP/semiprime.php
Normal file
21
Task/Semiprime/PHP/semiprime.php
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
// Semiprime
|
||||
|
||||
function primeFactorsCount($n)
|
||||
{
|
||||
$n = abs($n);
|
||||
$count = 0; // Result
|
||||
if ($n >= 2)
|
||||
for ($factor = 2; $factor <= $n; $factor++)
|
||||
while ($n % $factor == 0) {
|
||||
$count++;
|
||||
$n /= $factor;
|
||||
}
|
||||
return $count;
|
||||
}
|
||||
|
||||
echo "Enter an integer: ",
|
||||
$n = (int)fgets(STDIN);
|
||||
echo (primeFactorsCount($n) == 2 ?
|
||||
"It is a semiprime.\n" : "It is not a semiprime.\n");
|
||||
?>
|
||||
20
Task/Semiprime/PL-0/semiprime.pl0
Normal file
20
Task/Semiprime/PL-0/semiprime.pl0
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
var n, count, factor;
|
||||
begin
|
||||
? n;
|
||||
if n < 0 then n := -n;
|
||||
count := 0;
|
||||
if n >= 2 then
|
||||
begin
|
||||
factor := 2;
|
||||
while factor <= n do
|
||||
begin
|
||||
while (n / factor) * factor = n do
|
||||
begin
|
||||
count := count + 1; n := n / factor
|
||||
end;
|
||||
factor := factor + 1
|
||||
end;
|
||||
end;
|
||||
if count = 2 then ! 1;
|
||||
if count <> 2 then ! 0
|
||||
end.
|
||||
89
Task/Semiprime/PL-I/semiprime.pli
Normal file
89
Task/Semiprime/PL-I/semiprime.pli
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
*process source attributes xref nest or(!);
|
||||
/*--------------------------------------------------------------------
|
||||
* 22.02.2014 Walter Pachl using the is_prime code from
|
||||
* PL/I 'prime decomposition'
|
||||
* 23.02. WP start test for second prime with 2 or first prime found
|
||||
*-------------------------------------------------------------------*/
|
||||
spb: Proc options(main);
|
||||
Dcl a(10) Bin Fixed(31)
|
||||
Init(900660121,2,4,1679,1234567,32768,99,9876543,100,5040);
|
||||
Dcl (x,n,nf,i,j) Bin Fixed(31) Init(0);
|
||||
Dcl f(3) Bin Fixed(31);
|
||||
Dcl txt Char(30) Var;
|
||||
Dcl bit Bit(1);
|
||||
Do i=1 To hbound(a);
|
||||
bit=is_semiprime(a(i));
|
||||
Select(nf);
|
||||
When(0,1) txt=' is prime';
|
||||
When(2) txt=' is semiprime '!!factors(a(i));
|
||||
Otherwise txt=' is NOT semiprime '!!factors(a(i));
|
||||
End;
|
||||
Put Edit(a(i),bit,txt)(Skip,f(10),x(1),b(1),a);
|
||||
End;
|
||||
|
||||
is_semiprime: Proc(x) Returns(bit(1));
|
||||
/*--------------------------------------------------------------------
|
||||
* Returns '1'b if x is semiprime, '0'b otherwise
|
||||
* in addition
|
||||
* it sets f(1) and f(2) to the first (or only) prime factor(s)
|
||||
*-------------------------------------------------------------------*/
|
||||
Dcl x Bin Fixed(31);
|
||||
nf=0;
|
||||
f=0;
|
||||
x=a(i);
|
||||
n=x;
|
||||
f(1)=2;
|
||||
loop:
|
||||
Do While(nf<=2 & n>1);
|
||||
If is_prime(n) Then Do;
|
||||
Call mem(n);
|
||||
Leave loop;
|
||||
End;
|
||||
Else Do;
|
||||
loop2:
|
||||
Do j=f(1) By 1 While(j*j<=n);
|
||||
If is_prime(j)&mod(n,j)=0 Then Do;
|
||||
Call mem(j);
|
||||
n=n/j;
|
||||
Leave loop2;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
Return(nf=2);
|
||||
End;
|
||||
|
||||
is_prime: Proc(n) Returns(bit(1));
|
||||
Dcl n Bin Fixed(31);
|
||||
Dcl i Bin Fixed(31);
|
||||
If n < 2 Then Return('0'b);
|
||||
If n = 2 Then Return('1'b);
|
||||
If mod(n,2)=0 Then Return('0'b);
|
||||
Do i = 3 by 2 While(i*i<=n);
|
||||
If mod(n,i)=0 Then Return('0'b);
|
||||
End;
|
||||
Return('1'b);
|
||||
End is_prime;
|
||||
|
||||
mem: Proc(x);
|
||||
Dcl x Bin Fixed(31);
|
||||
nf+=1;
|
||||
f(nf)=x;
|
||||
End;
|
||||
|
||||
factors: Proc(x) Returns(Char(150) Var);
|
||||
Dcl x Bin Fixed(31);
|
||||
Dcl (res,net) Char(150) Var Init('');
|
||||
Dcl (i,f3) Bin Fixed(31);
|
||||
res=f(1)!!'*'!!f(2);
|
||||
f3=x/(f(1)*f(2));
|
||||
If f3>1 Then
|
||||
res=res!!'*'!!f3;
|
||||
Do i=1 To length(res);
|
||||
If substr(res,i,1)>' ' Then
|
||||
net=net!!substr(res,i,1);
|
||||
End;
|
||||
Return(net);
|
||||
End;
|
||||
|
||||
End spb;
|
||||
46
Task/Semiprime/PL-M/semiprime.plm
Normal file
46
Task/Semiprime/PL-M/semiprime.plm
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
100H: /* FIND SOME SEMI-PRIMES - NUMBERS WITH EXACTLY 2 PRIME FACTORS */
|
||||
|
||||
/* CP/M BDOS SYSTEM CALL AND I/O ROUTINES */
|
||||
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END;
|
||||
PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END;
|
||||
PR$STRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END;
|
||||
PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END;
|
||||
PR$NUMBER: PROCEDURE( N ); /* PRINTS A NUMBER IN THE MINIMUN FIELD WIDTH */
|
||||
DECLARE N ADDRESS;
|
||||
DECLARE V ADDRESS, N$STR ( 6 )BYTE, W BYTE;
|
||||
V = N;
|
||||
W = LAST( N$STR );
|
||||
N$STR( W ) = '$';
|
||||
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
|
||||
DO WHILE( ( V := V / 10 ) > 0 );
|
||||
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
|
||||
END;
|
||||
CALL PR$STRING( .N$STR( W ) );
|
||||
END PR$NUMBER;
|
||||
|
||||
/* TASK */
|
||||
|
||||
/* RETURNS TRUE IF V IS SEMI-PRIME, FALSE OTHERWISE */
|
||||
IS$SEMI$PRIME: PROCEDURE( V )BYTE;
|
||||
DECLARE V ADDRESS;
|
||||
DECLARE ( A, B, C ) ADDRESS;
|
||||
A = 2; B = 0; C = V;
|
||||
DO WHILE B < 3 AND C > 1;
|
||||
IF C MOD A = 0 THEN DO;
|
||||
C = C / A;
|
||||
B = B + 1;
|
||||
END;
|
||||
ELSE A = A + 1;
|
||||
END;
|
||||
RETURN B = 2;
|
||||
END IS$SEMI$PRIME;
|
||||
|
||||
DECLARE X ADDRESS;
|
||||
DO X = 2 TO 99;
|
||||
IF IS$SEMI$PRIME( X ) THEN DO;
|
||||
CALL PR$NUMBER( X );
|
||||
CALL PR$CHAR( ' ' );
|
||||
END;
|
||||
END;
|
||||
|
||||
EOF
|
||||
36
Task/Semiprime/PROMAL/semiprime.promal
Normal file
36
Task/Semiprime/PROMAL/semiprime.promal
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
;;; find some semiprimes - numbers with two prime factors
|
||||
|
||||
PROGRAM semiPrimes
|
||||
INCLUDE library
|
||||
|
||||
FUNC BYTE isSemiPrime
|
||||
ARG WORD n
|
||||
WORD f
|
||||
WORD factorCount
|
||||
BYTE result
|
||||
BEGIN
|
||||
f = 2
|
||||
factorCount = 0
|
||||
WHILE factorCount < 3 AND n > 1
|
||||
WHILE n % f = 0
|
||||
factorCount = factorCount + 1
|
||||
n = n / f
|
||||
f = f + 1
|
||||
IF factorCOunt = 2
|
||||
result = 1
|
||||
ELSE
|
||||
result = 0
|
||||
RETURN result
|
||||
END
|
||||
|
||||
WORD n
|
||||
BEGIN
|
||||
OUTPUT "Semiprimes under 100:#C "
|
||||
FOR n = 1 TO 99
|
||||
IF isSemiPrime( n )
|
||||
OUTPUT " #W", n
|
||||
OUTPUT "#CSemiprimes between 1670 and 1690:#C "
|
||||
FOR n = 1670 TO 1690
|
||||
IF isSemiPrime( n )
|
||||
OUTPUT " #W", n
|
||||
END
|
||||
10
Task/Semiprime/Palo-Alto-Tiny-BASIC/semiprime.basic
Normal file
10
Task/Semiprime/Palo-Alto-Tiny-BASIC/semiprime.basic
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
10 REM SEMIPRIME
|
||||
20 INPUT "ENTER AN INTEGER"N
|
||||
30 LET N=ABS(N)
|
||||
40 LET C=0
|
||||
50 IF N<2 GOTO 90
|
||||
60 FOR F=2 TO N
|
||||
70 IF (N/F)*F=N LET C=C+1,N=N/F;GOTO 70
|
||||
80 NEXT F
|
||||
90 IF C=2 PRINT "IT IS A SEMIPRIME.";STOP
|
||||
100 PRINT "IT IS NOT A SEMIPRIME.";STOP
|
||||
41
Task/Semiprime/Pascal/semiprime.pas
Normal file
41
Task/Semiprime/Pascal/semiprime.pas
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
program SemiPrime;
|
||||
{$IFDEF FPC}
|
||||
{$Mode objfpc}// compiler switch to use result
|
||||
{$ELSE}
|
||||
{$APPTYPE CONSOLE} // for Delphi
|
||||
{$ENDIF}
|
||||
uses
|
||||
primTrial;
|
||||
|
||||
function isSemiprime(n: longWord;doWrite:boolean): boolean;
|
||||
var
|
||||
fac1 : LongWord;
|
||||
begin
|
||||
//a simple isAlmostPrime(n,2) would do without output;
|
||||
fac1 := SmallFactor(n);
|
||||
IF fac1 < n then
|
||||
Begin
|
||||
n := n div fac1;
|
||||
result := SmallFactor(n) = n;
|
||||
if result AND doWrite then
|
||||
write(fac1:10,'*',n:11)
|
||||
end
|
||||
else
|
||||
result := false;
|
||||
end;
|
||||
var
|
||||
i,k : longWord;
|
||||
BEGIN
|
||||
For i := 2 to 97 do
|
||||
IF isSemiPrime(i,false) then
|
||||
write(i:3);
|
||||
writeln;
|
||||
//test for big numbers
|
||||
k := 4000*1000*1000;
|
||||
i := k-100;
|
||||
repeat
|
||||
IF isSemiPrime(i,true) then
|
||||
writeln(' = ',i:10);
|
||||
inc(i);
|
||||
until i> k;
|
||||
END.
|
||||
4
Task/Semiprime/Perl/semiprime-1.pl
Normal file
4
Task/Semiprime/Perl/semiprime-1.pl
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
use ntheory "is_semiprime";
|
||||
for ([1..100], [1675..1681], [2,4,99,100,1679,5030,32768,1234567,9876543,900660121]) {
|
||||
print join(" ",grep { is_semiprime($_) } @$_),"\n";
|
||||
}
|
||||
2
Task/Semiprime/Perl/semiprime-2.pl
Normal file
2
Task/Semiprime/Perl/semiprime-2.pl
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
use ntheory "factor";
|
||||
print join(" ", grep { scalar factor($_) == 2 } 1..100),"\n";
|
||||
9
Task/Semiprime/Perl/semiprime-3.pl
Normal file
9
Task/Semiprime/Perl/semiprime-3.pl
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
use ntheory qw/factor is_prime trial_factor/;
|
||||
sub issemi {
|
||||
my $n = shift;
|
||||
if ((my @p = trial_factor($n,500)) > 1) {
|
||||
return 0 if @p > 2;
|
||||
return !!is_prime($p[1]) if @p == 2;
|
||||
}
|
||||
2 == factor($n);
|
||||
}
|
||||
6
Task/Semiprime/Phix/semiprime.phix
Normal file
6
Task/Semiprime/Phix/semiprime.phix
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
-->
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">semiprime</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">prime_factors</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #004600;">true</span><span style="color: #0000FF;">))==</span><span style="color: #000000;">2</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">100</span><span style="color: #0000FF;">)&</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1680</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1675</span><span style="color: #0000FF;">),</span><span style="color: #000000;">semiprime</span><span style="color: #0000FF;">),{</span><span style="color: #004600;">pp_IntCh</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">})</span>
|
||||
<!--
|
||||
21
Task/Semiprime/PicoLisp/semiprime.l
Normal file
21
Task/Semiprime/PicoLisp/semiprime.l
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
(de factor (N)
|
||||
(make
|
||||
(let
|
||||
(D 2
|
||||
L (1 2 2 . (4 2 4 2 4 6 2 6 .))
|
||||
M (sqrt N) )
|
||||
(while (>= M D)
|
||||
(if (=0 (% N D))
|
||||
(setq M
|
||||
(sqrt (setq N (/ N (link D)))) )
|
||||
(inc 'D (pop 'L)) ) )
|
||||
(link N) ) ) )
|
||||
|
||||
(println
|
||||
(filter
|
||||
'((X)
|
||||
(let L (factor X)
|
||||
(and (cdr L) (not (cddr L))) ) )
|
||||
(conc (range 1 100) (range 1675 1680)) ) )
|
||||
|
||||
(bye)
|
||||
26
Task/Semiprime/PowerShell/semiprime.psh
Normal file
26
Task/Semiprime/PowerShell/semiprime.psh
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
function isPrime ($n) {
|
||||
if ($n -le 1) {$false}
|
||||
elseif (($n -eq 2) -or ($n -eq 3)) {$true}
|
||||
else{
|
||||
$m = [Math]::Floor([Math]::Sqrt($n))
|
||||
(@(2..$m | where {($_ -lt $n) -and ($n % $_ -eq 0) }).Count -eq 0)
|
||||
}
|
||||
}
|
||||
function semiprime ($n) {
|
||||
if($n -gt 3) {
|
||||
$lim = [Math]::Floor($n/2)+1
|
||||
$i = 2
|
||||
while(($i -lt $lim) -and ($n%$i -ne 0)){ $i += 1}
|
||||
if($i -eq $lim){@()}
|
||||
elseif(-not (isPrime ($n/$i))){@()}
|
||||
else{@($i,($n/$i))}
|
||||
} else {@()}
|
||||
}
|
||||
$OFS = " x "
|
||||
"1679: $(semiprime 1679)"
|
||||
"87: $(semiprime 87)"
|
||||
"25: $(semiprime 25)"
|
||||
"12: $(semiprime 12)"
|
||||
"6: $(semiprime 6)"
|
||||
$OFS = " "
|
||||
"semiprime from 1 to 100: $(1..100 | where {semiprime $_})"
|
||||
26
Task/Semiprime/Prolog/semiprime.pro
Normal file
26
Task/Semiprime/Prolog/semiprime.pro
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
factors(N, FList):-
|
||||
factors(N, 2, 0, FList).
|
||||
|
||||
factors(1, _, _Count, []).
|
||||
factors(_, _, Count, []):- Count > 1. % break on 2 factors reached
|
||||
factors(N, Start, Count, [Fac|FList]):-
|
||||
N1 is floor(sqrt(N)),
|
||||
between(Start, N1, Fac),
|
||||
N mod Fac =:= 0,!,
|
||||
N2 is N div Fac,
|
||||
Count1 is Count + 1,
|
||||
factors(N2, Fac, Count1, FList).
|
||||
factors(N, _, _, [N]):- N >= 2.
|
||||
|
||||
semiPrimeList(Limit, List):-
|
||||
findall(N, semiPrimes(2, Limit, N), List).
|
||||
|
||||
semiPrimes(Start, Limit, N):-
|
||||
between(Start, Limit, N),
|
||||
factors(N, [F1, F2]),
|
||||
N =:= F1 * F2. % correct factors break
|
||||
|
||||
do:- semiPrimeList(100, SemiPrimes),
|
||||
writeln(SemiPrimes),
|
||||
findall(N, semiPrimes(1675, 1685, N), SemiPrimes2),
|
||||
writeln(SemiPrimes2).
|
||||
25
Task/Semiprime/PureBasic/semiprime.basic
Normal file
25
Task/Semiprime/PureBasic/semiprime.basic
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
Procedure.s semiprime(n.i)
|
||||
a.i = 2
|
||||
c.i = 0
|
||||
While c < 3 And n > 1
|
||||
If (n % a) = 0
|
||||
n / a
|
||||
c + 1
|
||||
Else
|
||||
a + 1
|
||||
EndIf
|
||||
Wend
|
||||
If c = 2
|
||||
ProcedureReturn "True" ;#True
|
||||
EndIf
|
||||
ProcedureReturn "False" ;#False
|
||||
EndProcedure
|
||||
|
||||
OpenConsole()
|
||||
For i.i = 0 To 64
|
||||
PrintN(Str(i) + #TAB$ + semiprime(i))
|
||||
Next i
|
||||
|
||||
PrintN(#CRLF$ + "--- terminado, pulsa RETURN---"): Input()
|
||||
CloseConsole()
|
||||
End
|
||||
8
Task/Semiprime/Python/semiprime-1.py
Normal file
8
Task/Semiprime/Python/semiprime-1.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
from prime_decomposition import decompose
|
||||
|
||||
def semiprime(n):
|
||||
d = decompose(n)
|
||||
try:
|
||||
return next(d) * next(d) == n
|
||||
except StopIteration:
|
||||
return False
|
||||
5
Task/Semiprime/Python/semiprime-2.py
Normal file
5
Task/Semiprime/Python/semiprime-2.py
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
>>> semiprime(1679)
|
||||
True
|
||||
>>> [n for n in range(1,101) if semiprime(n)]
|
||||
[4, 6, 9, 10, 14, 15, 21, 22, 25, 26, 33, 34, 35, 38, 39, 46, 49, 51, 55, 57, 58, 62, 65, 69, 74, 77, 82, 85, 86, 87, 91, 93, 94, 95]
|
||||
>>>
|
||||
4
Task/Semiprime/Quackery/semiprime.quackery
Normal file
4
Task/Semiprime/Quackery/semiprime.quackery
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
[ primefactors size 2 = ] is semiprime ( n --> b )
|
||||
|
||||
say "Semiprimes less than 100:" cr
|
||||
100 times [ i^ semiprime if [ i^ echo sp ] ]
|
||||
56
Task/Semiprime/REXX/semiprime-1.rexx
Normal file
56
Task/Semiprime/REXX/semiprime-1.rexx
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
/* REXX ---------------------------------------------------------------
|
||||
* 20.02.2014 Walter Pachl relying on 'prime decomposition'
|
||||
* 21.02.2014 WP Clarification: I copied the algorithm created by
|
||||
* Gerard Schildberger under the task referred to above
|
||||
* 21.02.2014 WP Make sure that factr is not called illegally
|
||||
*--------------------------------------------------------------------*/
|
||||
Call test 4
|
||||
Call test 9
|
||||
Call test 10
|
||||
Call test 12
|
||||
Call test 1679
|
||||
Exit
|
||||
|
||||
test:
|
||||
Parse Arg z
|
||||
If is_semiprime(z) Then Say z 'is semiprime' fl
|
||||
Else Say z 'is NOT semiprime' fl
|
||||
Return
|
||||
|
||||
is_semiprime:
|
||||
Parse Arg z
|
||||
If z<1 | datatype(z,'W')=0 Then Do
|
||||
Say 'Argument ('z') must be a natural number (1, 2, 3, ...)'
|
||||
fl=''
|
||||
End
|
||||
Else
|
||||
fl=factr(z)
|
||||
Return words(fl)=2
|
||||
|
||||
/*----------------------------------FACTR subroutine-----------------*/
|
||||
factr: procedure; parse arg x 1 z,list /*sets X&Z to arg1, LIST=''. */
|
||||
if x==1 then return '' /*handle the special case of X=1.*/
|
||||
j=2; call .factr /*factor for the only even prime.*/
|
||||
j=3; call .factr /*factor for the 1st odd prime.*/
|
||||
j=5; call .factr /*factor for the 2nd odd prime.*/
|
||||
j=7; call .factr /*factor for the 3rd odd prime.*/
|
||||
j=11; call .factr /*factor for the 4th odd prime.*/
|
||||
j=13; call .factr /*factor for the 5th odd prime.*/
|
||||
j=17; call .factr /*factor for the 6th odd prime.*/
|
||||
/* [?] could be optimized more.*/
|
||||
/* [?] J in loop starts at 17+2*/
|
||||
do y=0 by 2; j=j+2+y//4 /*insure J isn't divisible by 3. */
|
||||
if right(j,1)==5 then iterate /*fast check for divisible by 5. */
|
||||
if j*j>z then leave /*are we higher than the v of Z ?*/
|
||||
if j>Z then leave /*are we higher than value of Z ?*/
|
||||
call .factr /*invoke .FACTR for some factors.*/
|
||||
end /*y*/ /* [?] only tests up to the v X.*/
|
||||
/* [?] LIST has a leading blank.*/
|
||||
if z==1 then return list /*if residual=unity, don't append*/
|
||||
return list z /*return list, append residual. */
|
||||
/*-------------------------------.FACTR internal subroutine----------*/
|
||||
.factr: do while z//j==0 /*keep dividing until we can't. */
|
||||
list=list j /*add number to the list (J). */
|
||||
z=z%j /*% (percent) is integer divide.*/
|
||||
end /*while z··· */ /* // ?---remainder integer ÷.*/
|
||||
return /*finished, now return to invoker*/
|
||||
35
Task/Semiprime/REXX/semiprime-2.rexx
Normal file
35
Task/Semiprime/REXX/semiprime-2.rexx
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/*REXX program determines if any integer (or a range of integers) is/are semiprime. */
|
||||
parse arg bot top . /*obtain optional arguments from the CL*/
|
||||
if bot=='' | bot=="," then bot=random() /*None given? User wants us to guess.*/
|
||||
if top=='' | top=="," then top=bot /*maybe define a range of numbers. */
|
||||
tell= top=>0 | top==bot /*should results be shown to the term? */
|
||||
w=max(length(bot), length(top)) + 5 /*obtain the maximum width of numbers. */
|
||||
numeric digits max(9, w) /*ensure there're enough decimal digits*/
|
||||
#=0 /*initialize number of semiprimes found*/
|
||||
do n=bot to abs(top) /*show results for a range of numbers. */
|
||||
?=isSemiPrime(n); #=#+? /*Is N a semiprime?; Maybe bump counter*/
|
||||
if tell then say right(n,w) right(word("isn't" 'is', ?+1), 6) 'semiprime.'
|
||||
end /*n*/
|
||||
say
|
||||
if bot\==top then say 'found ' # " semiprimes."
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
isPrime: procedure; parse arg x; if x<2 then return 0 /*number too low?*/
|
||||
if wordpos(x, '2 3 5 7 11 13 17 19 23')\==0 then return 1 /*it's low prime.*/
|
||||
if x//2==0 then return 0; if x//3==0 then return 0 /*÷ by 2; ÷ by 3?*/
|
||||
do j=5 by 6 until j*j>x; if x//j==0 then return 0 /*not a prime. */
|
||||
if x//(j+2)==0 then return 0 /* " " " */
|
||||
end /*j*/
|
||||
return 1 /*indicate that X is a prime number. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
isSemiPrime: procedure; parse arg x; if x<4 then return 0
|
||||
|
||||
do i=2 for 2; if x//i==0 then if isPrime(x%i) then return 1
|
||||
else return 0
|
||||
end /*i*/
|
||||
/* ___ */
|
||||
do j=5 by 6; if j*j>x then return 0 /* > √ x ?*/
|
||||
do k=j by 2 for 2; if x//k==0 then if isPrime(x%k) then return 1
|
||||
else return 0
|
||||
end /*k*/ /* [↑] see if 2nd factor is prime or ¬*/
|
||||
end /*j*/ /* [↑] J is never a multiple of three.*/
|
||||
41
Task/Semiprime/REXX/semiprime-3.rexx
Normal file
41
Task/Semiprime/REXX/semiprime-3.rexx
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
/*REXX program determines if any integer (or a range of integers) is/are semiprime. */
|
||||
parse arg bot top . /*obtain optional arguments from the CL*/
|
||||
if bot=='' | bot=="," then bot=random() /*None given? User wants us to guess.*/
|
||||
if top=='' | top=="," then top=bot /*maybe define a range of numbers. */
|
||||
tell= bot=>0 & top=>0 /*should results be shown to the term? */
|
||||
w=max(length(bot), length(top)) /*obtain the maximum width of numbers. */
|
||||
!.=; !.2=1; !.3=1; !.5=1; !.7=1; !.11=1; !.13=1; !.17=1; !.19=1; !.23=1; !.29=1; !.31=1
|
||||
numeric digits max(9, w) /*ensure there're enough decimal digits*/
|
||||
#=0 /*initialize number of semiprimes found*/
|
||||
do n=abs(bot) to abs(top) /*show results for a range of numbers. */
|
||||
?=isSemiPrime(n); #=#+? /*Is N a semiprime?; Maybe bump counter*/
|
||||
if tell then say right(n,w) right(word("isn't" 'is', ?+1), 6) 'semiprime.'
|
||||
end /*n*/
|
||||
say
|
||||
if bot\==top then say 'found ' # " semiprimes."
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
isPrime: procedure expose !.; parse arg x; if x<2 then return 0 /*number too low?*/
|
||||
if !.x==1 then return 1 /*a known prime. */
|
||||
if x// 2==0 then return 0; if x//3==0 then return 0 /*÷ by 2;÷by 3?*/
|
||||
parse var x '' -1 _; if _==5 then return 0 /*last digit a 5?*/
|
||||
if x// 7==0 then return 0; if x//11==0 then return 0 /*÷ by 7;÷by 11?*/
|
||||
if x//13==0 then return 0; if x//17==0 then return 0 /*÷ by 13;÷by 17?*/
|
||||
if x//19==0 then return 0; if x//23==0 then return 0 /*÷ by 19;÷by 23?*/
|
||||
do j=29 by 6 until j*j>x; if x//j==0 then return 0 /*not a prime. */
|
||||
if x//(j+2)==0 then return 0 /* " " " */
|
||||
end /*j*/
|
||||
!.x=1; return 1 /*indicate that X is a prime number. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
isSemiPrime: procedure expose !.; parse arg x; if x<4 then return 0
|
||||
|
||||
do i=2 for 2; if x//i==0 then if isPrime(x%i) then return 1
|
||||
else return 0
|
||||
end /*i*/
|
||||
/* ___ */
|
||||
do j=5 by 6 until j*j>x /* > √ x ?*/
|
||||
do k=j by 2 for 2; if x//k==0 then if isPrime(x%k) then return 1
|
||||
else return 0
|
||||
end /*k*/ /* [↑] see if 2nd factor is prime or ¬*/
|
||||
end /*j*/ /* [↑] J is never a multiple of three.*/
|
||||
return 0
|
||||
15
Task/Semiprime/Racket/semiprime-1.rkt
Normal file
15
Task/Semiprime/Racket/semiprime-1.rkt
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#lang racket
|
||||
(require math)
|
||||
|
||||
(define (pair-factorize n)
|
||||
"Return all two-number factorizations of a number"
|
||||
(let ([up-limit (integer-sqrt n)])
|
||||
(map (λ (x) (list x (/ n x)))
|
||||
(filter (λ (x) (<= x up-limit)) (divisors n)))))
|
||||
|
||||
(define (semiprime n)
|
||||
"Determine if a number is semiprime i.e. a product of two primes.
|
||||
Check if any pair of complete factors consists of primes."
|
||||
(for/or ((pair (pair-factorize n)))
|
||||
(for/and ((el pair))
|
||||
(prime? el))))
|
||||
12
Task/Semiprime/Racket/semiprime-2.rkt
Normal file
12
Task/Semiprime/Racket/semiprime-2.rkt
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
#lang racket
|
||||
(require math)
|
||||
|
||||
(define (semiprime n)
|
||||
"Alternative implementation.
|
||||
Check if there are two prime factors whose product is the argument
|
||||
or if there is a single prime factor whose square is the argument"
|
||||
(let ([prime-factors (factorize n)])
|
||||
(or (and (= (length prime-factors) 1)
|
||||
(= (expt (caar prime-factors) (cadar prime-factors)) n))
|
||||
(and (= (length prime-factors) 2)
|
||||
(= (foldl (λ (x y) (* (car x) y)) 1 prime-factors) n)))))
|
||||
14
Task/Semiprime/Raku/semiprime-1.raku
Normal file
14
Task/Semiprime/Raku/semiprime-1.raku
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
sub is-semiprime (Int $n --> Bool) {
|
||||
not $n.is-prime and
|
||||
.is-prime given
|
||||
$n div first $n %% *, flat grep &is-prime, 2 .. *;
|
||||
}
|
||||
|
||||
use Test;
|
||||
my @primes = flat grep &is-prime, 2 .. 100;
|
||||
for ^5 {
|
||||
nok is-semiprime([*] my @f1 = @primes.roll(1)), ~@f1;
|
||||
ok is-semiprime([*] my @f2 = @primes.roll(2)), ~@f2;
|
||||
nok is-semiprime([*] my @f3 = @primes.roll(3)), ~@f3;
|
||||
nok is-semiprime([*] my @f4 = @primes.roll(4)), ~@f4;
|
||||
}
|
||||
38
Task/Semiprime/Raku/semiprime-2.raku
Normal file
38
Task/Semiprime/Raku/semiprime-2.raku
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
sub is-semiprime ( Int $n where * > 0 ) {
|
||||
return False if $n.is-prime;
|
||||
my $factor = find-factor( $n );
|
||||
return True if $factor.is-prime && ( $n div $factor ).is-prime;
|
||||
False;
|
||||
}
|
||||
|
||||
sub find-factor ( Int $n, $constant = 1 ) {
|
||||
my $x = 2;
|
||||
my $rho = 1;
|
||||
my $factor = 1;
|
||||
while $factor == 1 {
|
||||
$rho *= 2;
|
||||
my $fixed = $x;
|
||||
for ^$rho {
|
||||
$x = ( $x * $x + $constant ) % $n;
|
||||
$factor = ( $x - $fixed ) gcd $n;
|
||||
last if 1 < $factor;
|
||||
}
|
||||
}
|
||||
$factor = find-factor( $n, $constant + 1 ) if $n == $factor;
|
||||
$factor;
|
||||
}
|
||||
|
||||
INIT my $start = now;
|
||||
|
||||
# Infinite list of semiprimes
|
||||
constant @semiprimes = lazy gather for 4 .. * { .take if .&is-semiprime };
|
||||
|
||||
# Show the semiprimes < 100
|
||||
say 'Semiprimes less than 100:';
|
||||
say @semiprimes[^ @semiprimes.first: * > 100, :k ], "\n";
|
||||
|
||||
# Check individual integers, or in this case, a range
|
||||
my $s = 2⁹⁷ - 1;
|
||||
say "Is $_ semiprime?: ", .&is-semiprime for $s .. $s + 30;
|
||||
|
||||
say 'elapsed seconds: ', now - $start;
|
||||
24
Task/Semiprime/Ring/semiprime.ring
Normal file
24
Task/Semiprime/Ring/semiprime.ring
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
prime = 1679
|
||||
decomp(prime)
|
||||
|
||||
func decomp nr
|
||||
x = ""
|
||||
sum = 0
|
||||
for i = 1 to nr
|
||||
if isPrime(i) and nr % i = 0
|
||||
sum = sum + 1
|
||||
x = x + string(i) + " * " ok
|
||||
if i = nr and sum = 2
|
||||
x2 = substr(x,1,(len(x)-2))
|
||||
see string(nr) + " = " + x2 + "is semiprime" + nl
|
||||
but i = nr and sum != 2 see string(nr) + " is not semiprime" + nl ok
|
||||
next
|
||||
|
||||
func isPrime n
|
||||
if n < 2 return false ok
|
||||
if n < 4 return true ok
|
||||
if n % 2 = 0 and n != 2 return false ok
|
||||
for d = 3 to sqrt(n) step 2
|
||||
if n % d = 0 return false ok
|
||||
next
|
||||
return true
|
||||
12
Task/Semiprime/Ruby/semiprime-1.rb
Normal file
12
Task/Semiprime/Ruby/semiprime-1.rb
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
require 'prime'
|
||||
# 75.prime_division # Returns the factorization.75 divides by 3 once and by 5 twice => [[3, 1], [5, 2]]
|
||||
|
||||
class Integer
|
||||
def semi_prime?
|
||||
prime_division.sum(&:last) == 2
|
||||
end
|
||||
end
|
||||
|
||||
p 1679.semi_prime? # true
|
||||
p ( 1..100 ).select( &:semi_prime? )
|
||||
# [4, 6, 9, 10, 14, 15, 21, 22, 25, 26, 33, 34, 35, 38, 39, 46, 49, 51, 55, 57, 58, 62, 65, 69, 74, 77, 82, 85, 86, 87, 91, 93, 94, 95]
|
||||
5
Task/Semiprime/Ruby/semiprime-2.rb
Normal file
5
Task/Semiprime/Ruby/semiprime-2.rb
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
def semiprime(n)
|
||||
`factor #{n}`.split.size == 3
|
||||
end
|
||||
n = 2**72 - 1 #4722366482869645213695
|
||||
(n-50..n).each { |n| puts "#{n} -> #{semiprime(n)}" }
|
||||
17
Task/Semiprime/Run-BASIC/semiprime.basic
Normal file
17
Task/Semiprime/Run-BASIC/semiprime.basic
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
function semiprime$(n)
|
||||
a = 2
|
||||
c = 0
|
||||
while c < 3 and n > 1
|
||||
if n mod a = 0 then
|
||||
n = n / a
|
||||
c = c + 1
|
||||
else
|
||||
a = a + 1
|
||||
end if
|
||||
wend
|
||||
if c = 2 then semiprime$ = "True" else semiprime$ = "False"
|
||||
end function
|
||||
|
||||
for i = 0 to 64
|
||||
print i; chr$(9); semiprime$(i)
|
||||
next i
|
||||
56
Task/Semiprime/Rust/semiprime-1.rust
Normal file
56
Task/Semiprime/Rust/semiprime-1.rust
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
extern crate primal;
|
||||
|
||||
fn isqrt(n: usize) -> usize {
|
||||
(n as f64).sqrt() as usize
|
||||
}
|
||||
|
||||
fn is_semiprime(mut n: usize) -> bool {
|
||||
let root = isqrt(n) + 1;
|
||||
let primes1 = primal::Sieve::new(root);
|
||||
let mut count = 0;
|
||||
|
||||
for i in primes1.primes_from(2).take_while(|&x| x < root) {
|
||||
while n % i == 0 {
|
||||
n /= i;
|
||||
count += 1;
|
||||
}
|
||||
if n == 1 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if n != 1 {
|
||||
count += 1;
|
||||
}
|
||||
count == 2
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test1() {
|
||||
assert_eq!((2..10).filter(|&n| is_semiprime(n)).count(), 3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test2() {
|
||||
assert_eq!((2..100).filter(|&n| is_semiprime(n)).count(), 34);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test3() {
|
||||
assert_eq!((2..1_000).filter(|&n| is_semiprime(n)).count(), 299);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test4() {
|
||||
assert_eq!((2..10_000).filter(|&n| is_semiprime(n)).count(), 2_625);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test5() {
|
||||
assert_eq!((2..100_000).filter(|&n| is_semiprime(n)).count(), 23_378);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test6() {
|
||||
assert_eq!((2..1_000_000).filter(|&n| is_semiprime(n)).count(), 210_035);
|
||||
}
|
||||
12
Task/Semiprime/Rust/semiprime-2.rust
Normal file
12
Task/Semiprime/Rust/semiprime-2.rust
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
fn is_semiprime(n: usize) -> bool {
|
||||
fn iter(x: usize, start: usize, count: usize) -> usize {
|
||||
if count > 2 {return count} // break for semi_prime
|
||||
let limit = (x as f64).sqrt().ceil() as usize;
|
||||
match (start..=limit).skip_while(|i| x % i > 0).next() {
|
||||
Some(v) => iter(x / v, v, count + 1),
|
||||
None => if x < 2 { count }
|
||||
else { count + 1 }
|
||||
}
|
||||
}
|
||||
iter(n, 2, 0) == 2
|
||||
}
|
||||
20
Task/Semiprime/Scala/semiprime.scala
Normal file
20
Task/Semiprime/Scala/semiprime.scala
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
object Semiprime extends App {
|
||||
|
||||
def isSP(n: Int): Boolean = {
|
||||
var nf: Int = 0
|
||||
var l = n
|
||||
for (i <- 2 to l/2) {
|
||||
while (l % i == 0) {
|
||||
if (nf == 2) return false
|
||||
nf +=1
|
||||
l /= i
|
||||
}
|
||||
}
|
||||
nf == 2
|
||||
}
|
||||
|
||||
(2 to 100) filter {isSP(_) == true} foreach {i => print("%d ".format(i))}
|
||||
println
|
||||
1675 to 1681 foreach {i => println(i+" -> "+isSP(i))}
|
||||
|
||||
}
|
||||
27
Task/Semiprime/Seed7/semiprime.seed7
Normal file
27
Task/Semiprime/Seed7/semiprime.seed7
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
$ include "seed7_05.s7i";
|
||||
|
||||
const func boolean: semiPrime (in var integer: n) is func
|
||||
result
|
||||
var boolean: isSemiPrime is TRUE;
|
||||
local
|
||||
var integer: p is 2;
|
||||
var integer: f is 0;
|
||||
begin
|
||||
while f < 2 and p**2 <= n do
|
||||
while n rem p = 0 do
|
||||
n := n div p;
|
||||
incr(f);
|
||||
end while;
|
||||
incr(p);
|
||||
end while;
|
||||
isSemiPrime := f + ord(n > 1) = 2;
|
||||
end func;
|
||||
|
||||
const proc: main is func
|
||||
local
|
||||
var integer: v is 0;
|
||||
begin
|
||||
for v range 1675 to 1680 do
|
||||
writeln(v <& " -> " <& semiPrime(v));
|
||||
end for;
|
||||
end func;
|
||||
2
Task/Semiprime/Sidef/semiprime-1.sidef
Normal file
2
Task/Semiprime/Sidef/semiprime-1.sidef
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
say is_semiprime(2**128 + 1) #=> true
|
||||
say is_semiprime(2**256 - 1) #=> false
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue