세미 프라임입니까?


26

놀랍게도, 우리는 숫자가 semiprime 인지를 결정 하는 질문 이 없다고 생각 합니다.

세미 프라임은 반드시 고유하지 않은 2 개의 소수의 곱인 자연수입니다.

간단하지만 매우 중요한 개념입니다.

양의 정수가 주어지면 세미 프라임인지 확인하십시오. 진실하거나 거짓된 가치에 대해 동일한 산출물을 제공하는 한 당신의 산출물은 어떤 형태 일 수 있습니다. 성능이나 오버플로가 문제가되지 않을 정도로 입력이 충분히 작다고 가정 할 수도 있습니다.

테스트 사례 :

input -> output
1     -> false
2     -> false
3     -> false
4     -> true
6     -> true
8     -> false
30    -> false   (5 * 3 * 2), note it must be EXACTLY 2 (non-distinct) primes
49    -> true    (7 * 7)      still technically 2 primes
95    -> true
25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784406918290641249515082189298559149176184502808489120072844992687392807287776735971418347270261896375014971824691165077613379859095700097330459748808428401797429100642458691817195118746121515172654632282216869987549182422433637259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133844143603833904414952634432190114657544454178424020924616515723350778707749817125772467962926386356373289912154831438167899885040445364023527381951378636564391212010397122822120720357
      -> true, and go call someone, you just cracked RSA-2048

이것은 이므로 표준 규칙이 적용됩니다!


4
@WheatWizard 3 개의 소수 (거의 모든 언어에서 큰 차이는 아님)를 요구한다는 점에서 약간의 차이가 있으며 뚜렷한 소수 (일부 언어에서는 상당히 다름)입니다. 좀 더 자세한 토론을 계속하고 싶다면 채팅으로 토론 할 수 있습니다.
HyperNeutrino

2
@WheatWizard 당신은 좋은 점을 제기하지만, 마찬가지로, 우리는 이미 많은 유형의 질문을 가지고 있으며, 당신이 표현하는 것과는 달리 대부분의 질문은 그들의 영역에 상당한 기여를 추가하지만,이 질문에는 충분한 차이가 있습니다 나는 그것이 별도의 질문 / 게시물을 보증한다고 믿습니다.
HyperNeutrino

2
@hyperneutrino 두 도전에 대한 답변을보고, 차이는 소스 코드에서 2 대 3의 단일 숫자처럼 보입니다. 나는 그것을 큰 차이라고 부르지 않을 것입니다.
밀 마법사

2
@WheatWizard ... 또한 "하지 별개"대 "구별"이
HyperNeutrino

3
@LordFarquaad 단지 복제본이 나쁘다는 것을 의미하지는 않습니다. 내 마음 속에 복제본이 있다는 것은 좋은 일이다. 그것은 이미 커뮤니티가 이미 물어봤을 정도로 흥미로운 것을 요구한다는 것을 의미한다.
밀 마법사

답변:


19

Brachylog , 2 바이트

기본적으로 Sphenic number 도전에 대한 Fatalize의 답변 에서 나온 포트 .

ḋĊ

온라인으로 사용해보십시오!

방법?

ḋĊ - implicitly takes input
ḋ  - prime factorisation (with duplicates included)
 Ċ - is a couple

1
실제로 직업에 적합한 언어 : P
HyperNeutrino

2
@Uriel Ċ은 실제로 내장 된 두 변수 목록입니다. 선언적 언어 인 경우 출력은 기본적으로 만족도 테스트입니다 (예 : 자체적 true.으로 음이 아닌 정수에 대한 출력 ).
Jonathan Allan

이 2 바이트는 어떻습니까?
해롤드

1
@harold Brachylog의 코드 페이지에 대한 헤더 링크에서 "바이트"를 만들도록 방금 업데이트했습니다. 16 진수 덤프는 다음과 같습니다 c6 eb.
Jonathan Allan


8

매스 매 티카, 16 바이트

PrimeOmega@#==2&

PrimeOmega 다중성을 계산하여 소수 요소의 수를 계산합니다.


1
Dang, 내장되어 있습니까?
JungHwan Min

1
@JungHwanMin 존재하는 경우SemiprimeQ
ngenisis

좋은. 몰랐어요PrimeOmega
DavidC


7

파이썬 3 , 54 바이트

lambda n:0<sum((n%x<1)+(x**3==n)for x in range(2,n))<3

온라인으로 사용해보십시오!

이전 verson은 대형 큐브 번호 (약간의 반올림 문제가 있었다 125, 343등)
이 약수의 양 (뿐만 아니라 소수)이있는 경우, 계산 1또는 2그것을 반환합니다 True.
숫자가 두 개 이상의 소수를 갖지만 두 개의 제수 만있는 경우는 예외입니다. 이 경우 프라임의 완벽한 큐브입니다 (제수는 큐브 루트와 제곱근입니다). x**3==n이 경우를 다룰 것입니다. 큐브 루트 항목에 1을 추가하면 합계가 3까지 올라가고 오 탐지가 중지됩니다. 이 아름다운 설명을 해주신 Jonathan Allan에게 감사드립니다.


이 주장은
세미 프라임입니다

n**(1/3)%1>0<sum...작동해야합니다.
Dennis

1
@xnor는 그것을 고쳤다.
Rod

작은 편집을했습니다 (예 : 6 큐브에는 더 많은 제수가 있습니다)
Jonathan Allan

6

루비 , 56 48 바이트

->x{r=c=2;0while x%r<1?(x/=r;c-=1):x>=r+=1;c==0}

온라인으로 사용해보십시오!

작동 방식 :

->x{                    # Lambda function
    r=c=2;              # Starting from r=2, c=2
    0 while             # Repeat (0 counts as a nop)
        x%r<1? (        # If x mod r == 0
            x/=r:       # Divide x by r
            c-=1        # decrease c
        ):              # else
            x>=r+=1     # increase r, terminate if r>x 
    );
    c==0                # True if we found 2 factors
}

8 바이트를 절약 한 아이디어에 감사합니다.


c모든 요소를 ​​추가하는 배열로 만드는 대신 0부터 시작해서 카운트 업하지 않겠습니까? 그렇게 size하면 마지막 에 사용할 필요가 없습니다
Value Ink

당신이 옳습니다. 왜냐하면 다른 도전에 대한 인수 분해 함수를 작성하고 여기에서 재사용했기 때문입니다.
GB


4

Neim , 4 바이트

𝐏𝐥δ𝔼

온라인으로 사용해보십시오!


이것이 어떻게 4 바이트인지 설명 할 수 있습니까? ... 완전히 혼란 스럽습니다.
Mr. Xcoder

Lol 나는 이것을
HyperNeutrino


Mr.Xcoder가 Neim 코드 페이지를 사용하여 @이있다 𝐏, 𝐥, δ, 및 𝔼단일 바이트로.
HyperNeutrino

@HyperNeutrino 방금 2를 약간 난독 처리했으며 이제는 2가없는 유일한 답변입니다.)
Okx

4

파이썬 2 , 67 바이트

lambda k:f(k)==2
f=lambda n,k=2:n/k and(f(n,k+1),1+f(n/k,k))[n%k<1]

온라인으로 사용해보십시오!

@JonathanAllan 덕분에 -10 바이트!

Prime factorization 알고리즘에 대한 크레딧은 Dennis 로갑니다 (초기 버전)


Dennis의 답변 에서 나온 코드를 사용 했습니까 ? 그렇다면 신용을 제공해야합니다.
완전히 인간적인

1
@totallyhuman 아, 죄송합니다. 나는 오늘 2 가지 다른 답변으로 그것을 사용했고 그중 하나에서 그에게 신용을 줬지만 여기서 다시 한 번 잊어 버렸습니다. 그것을 발견해 주셔서 감사합니다!
Mr. Xcoder


@JonathanAllan 와우, 정말 고마워!
Mr. Xcoder


4

자바 스크립트 (ES6), 47 바이트

부울을 반환합니다.

n=>(k=1)==(d=n=>++k<n?n%k?d(n):d(n/k--)+1:0)(n)

데모


4

Mathematica 32 바이트

1 바이트 저장 ngenesis 덕분에

Tr@FactorInteger[#][[;;,2]]==2&

1
;;대신을 사용하여 1 바이트를 저장하십시오 All.
ngenisis






3

가이아 , 4 바이트

ḍl2=

4 바이트는 일반적인 길이 인 것 같습니다. 왜 궁금합니다 ... : P

온라인으로 사용해보십시오!

설명

ḍ     Prime factors
 l    Length
  2=  Equals 2?

4 바이트 내가 ... 왜 궁금해, 공통의 길이 될 것으로 보인다 모든 대답은 소인수, 길이입니다 아마 때문에, 2와 동일 -?
Mr. Xcoder

@MrXcoder Yep, 정확히
비즈니스 고양이

그 중 4 명은 BTW> _>
Mr. Xcoder

4는 또한 첫 번째 세미 프라임입니다. 유령 같은!
Neil




2

자바 8, 69 61 바이트

n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}

@Nevay 덕분에 -8 바이트 .

여기에서 시도하십시오.


1
else 문을 제거하여 else++r;8 바이트를 절약 할 수 있습니다 n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}.
Nevay


1

C #, 112 바이트

n=>{var r=Enumerable.Range(2,n);var l=r.Where(i=>r.All(x=>r.All(y=>y*x!=i)));return l.Any(x=>l.Any(y=>y*x==n));}

서식이 적용된 상태 :

n =>
{
    var r = Enumerable.Range (2, n);
    var l = r.Where (i => r.All (x => r.All (y => y * x != i)));
    return l.Any (x => l.Any (y => y * x == n));
}

그리고 테스트 프로그램으로 :

using System;
using System.Linq;


namespace S
{
    class P
    {
        static void Main ()
        {
            var f = new Func<int, bool> (
                n =>
                {
                    var r = Enumerable.Range (2, n);
                    var l = r.Where (i => r.All (x => r.All (y => y * x != i)));
                    return l.Any (x => l.Any (y => y * x == n));
                }
            );

            for (var i = 0; i < 100; i++)
                Console.WriteLine ($"{i} -> {f (i)}");
            Console.ReadLine ();
        }
    }
}

어떤 출력이 있습니까?

0 -> False
1 -> False
2 -> False
3 -> False
4 -> True
5 -> False
6 -> True
7 -> False
8 -> False
9 -> True
10 -> True
11 -> False
12 -> False
13 -> False
14 -> True
15 -> True
16 -> False
17 -> False
18 -> False
19 -> False
20 -> False
21 -> True
22 -> True
23 -> False
24 -> False
25 -> True
26 -> True
27 -> False
28 -> False
29 -> False
30 -> False
31 -> False
32 -> False
33 -> True
34 -> True
35 -> True
36 -> False
37 -> False
38 -> True
39 -> True
40 -> False
41 -> False
42 -> False
43 -> False
44 -> False
45 -> False
46 -> True
47 -> False
48 -> False
49 -> True
50 -> False
51 -> True
52 -> False
53 -> False
54 -> False
55 -> True
56 -> False
57 -> True
58 -> True
59 -> False
60 -> False
61 -> False
62 -> True
63 -> False
64 -> False
65 -> True
66 -> False
67 -> False
68 -> False
69 -> True
70 -> False
71 -> False
72 -> False
73 -> False
74 -> True
75 -> False
76 -> False
77 -> True
78 -> False
79 -> False
80 -> False
81 -> False
82 -> True
83 -> False
84 -> False
85 -> True
86 -> True
87 -> True
88 -> False
89 -> False
90 -> False
91 -> True
92 -> False
93 -> True
94 -> True
95 -> True
96 -> False
97 -> False
98 -> False
99 -> False


1

레티 나 , 45 바이트

.+
$*
^(11+)(\1)+$
$1;1$#2$*
A`\b(11+)\1+\b
;

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

.+
$*

단항으로 변환합니다.

^(11+)(\1)+$
$1;1$#2$*

두 가지 요소를 찾으십시오.

A`\b(11+)\1+\b

두 요소가 모두 주요한지 확인하십시오.

;

두 가지 요소가 발견되었는지 확인하십시오.


1

파이썬 2, 90 바이트

def g(x,i=2):
 while x%i:i+=1
 return i
def f(n,l=0):
 while 1%n:l+=1;n/=g(n)
 return l==2

fn보다 크거나 같은 정수를 가져 1오면 부울을 반환합니다.

온라인으로 사용해보십시오!

테스트 사례 :

>>> f(1)
False
>>> f(2)
False
>>> f(3)
False
>>> f(4)
True
>>> f(6)
True
>>> f(8)
False
>>> f(30)
False
>>> f(49)
True
>>> f(95)
True

1

J , 6 바이트

5 바이트는 일회성으로 작동합니다.

   2=#q: 8
0
   2=#q: 9
1

함수를 정의 할 때 6이 필요하다고 생각합니다.

   semiprime =. 2=#@q:
   (,. semiprime) 1 + i. 20
 1 0
 2 0
 3 0
 4 1
 5 0
 6 1
 7 0
 8 0
 9 1
10 1
11 0
12 0
13 0
14 1
15 1
16 0
17 0
18 0
19 0
20 0



0

펄 6 , 43 바이트

{my \f=first $_%%*,2..$_;?f&&is-prime $_/f}

온라인으로 사용해보십시오!

f입력 인자의 1보다 작은 계수보다이다 $_또는 Nil경우 $_1이다 함수의 리턴 값이있는 경우 true f참 (즉,하지 Nil) 상기 인자에 의해 분할 된 입력 인수는 소수이다.

경우 $_자체가 소수 일 후 f동일 할 것 $_, 및 $_ / f상기 식뿐만 아니라이 경우에 작동하므로, 주요하지 않은 1이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.