Apakah ini semiprime?

26

Anehnya, saya tidak berpikir kita memiliki pertanyaan untuk menentukan apakah suatu angka semiprime .

Semiprime adalah bilangan alami yang merupakan produk dari dua bilangan prima (tidak harus berbeda).

Cukup sederhana, tetapi konsep yang sangat penting.

Diberikan bilangan bulat positif, tentukan apakah itu semiprime. Keluaran Anda bisa dalam bentuk apa pun asalkan memberikan hasil yang sama untuk nilai apa pun yang benar atau salah. Anda juga dapat menganggap input Anda cukup kecil sehingga kinerja atau overflow tidak menjadi masalah.

Kasus uji:

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

Ini , jadi aturan standar berlaku!

Tuan Farquaad
sumber
4
@WheatWizard Ada sedikit perbedaan bahwa seseorang meminta 3 bilangan prima (bukan perbedaan besar untuk hampir semua bahasa) dan itu hanya untuk bilangan prima yang berbeda (cukup berbeda untuk beberapa bahasa). Saya dapat mendiskusikannya dengan Anda dalam obrolan jika Anda ingin melanjutkan diskusi yang lebih rinci.
HyperNeutrino
2
@WheatWizard Anda menaikkan poin yang baik, tetapi juga, kami sudah memiliki banyak jenis pertanyaan, dan meskipun, berbeda dengan apa yang Anda ungkapkan, kebanyakan dari mereka memang menambah kontribusi signifikan pada area mereka, pertanyaan ini memiliki cukup banyak perbedaan bahwa saya akan percaya bahwa itu menjamin pertanyaan / posting terpisah.
HyperNeutrino
2
@hyperneutrino melihat jawaban pada kedua tantangan, sepertinya perbedaannya adalah satu nomor dalam kode sumber, 2 vs 3. Saya tidak akan menyebut perbedaan besar.
Wheat Wizard
2
@WheatWizard Ada juga "berbeda" vs "tidak berbeda" ...
HyperNeutrino
3
@ LordFarquaad Hanya karena duplikatnya tidak berarti itu buruk. Menurut saya menjadi duplikat adalah hal yang baik, itu berarti Anda menanyakan sesuatu yang menurut komunitas cukup menarik untuk ditanyakan.
Wheat Wizard

Jawaban:

19

Brachylog , 2 byte

Pada dasarnya sebuah port dari jawaban Fatalize terhadap tantangan angka Sphenic.

ḋĊ

Cobalah online!

Bagaimana?

ḋĊ - implicitly takes input
ḋ  - prime factorisation (with duplicates included)
 Ċ - is a couple
Jonathan Allan
sumber
1
Bahasa yang tepat untuk pekerjaan itu: P
HyperNeutrino
2
@Uriel Ċsebenarnya merupakan daftar bawaan dari dua variabel; sebagai bahasa deklaratif, outputnya adalah, secara default, tes untuk kepuasan (mis. sendiri akan menghasilkan true.untuk bilangan bulat non-negatif).
Jonathan Allan
Bagaimana ini 2 byte?
Harold
1
@ Harvest Saya baru saja memperbarui untuk membuat "byte" di tautan tajuk ke halaman kode Brachylog. Sebuah dump hex akan menjadi c6 eb.
Jonathan Allan
16

Sekam , 4 byte

Lihat ma no Unicode!

=2Lp

Cobalah online!

Bagaimana?

=2Lp - a one input function
   p - prime factorisation (with duplicates included)
  L  - length
=2   - equals 2?
Jonathan Allan
sumber
8

Mathematica, 16 byte

PrimeOmega@#==2&

PrimeOmega menghitung jumlah faktor prima, menghitung multiplisitas.

ngenisis
sumber
1
Dang, ada builtin?
JungHwan Min
1
@JungHwanMin Kalau saja adaSemiprimeQ
ngenisis
Bagus. Saya tidak tahuPrimeOmega
DavidC
7

Pyth , 4 byte

q2lP

Suite uji .


Bagaimana?

q2lPQ     - Q is implicit input.

q2        - Is equal to 2?
    lPQ   - The length of the prime factors of the input.
Tuan Xcoder
sumber
Sialan, builtin lebih pendek! :(
HyperNeutrino
7

Python 3 , 54 byte

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

Cobalah online!

The verson sebelumnya memiliki beberapa masalah pembulatan pada angka kubus besar ( 125, 343, dll)
ini menghitung jumlah pembagi (tidak hanya bilangan prima), jika memiliki 1atau 2mengembalikan True.
Satu-satunya pengecualian adalah ketika angka memiliki lebih dari dua faktor utama tetapi hanya dua pembagi. Dalam hal ini ia adalah kubus sempurna dari suatu prima (pembagi-nya adalah akar kubusnya dan akar kuadratnya kuadrat). x**3==nakan membahas kasus ini, menambahkan satu ke entri root cube mendorong jumlah hingga hitungan 3 dan menghentikan false-positive. terima kasih Jonathan Allan untuk menulis dengan penjelasan yang indah ini

tongkat
sumber
Klaim 8 ini semiprime
xnor
n**(1/3)%1>0<sum...harus bekerja.
Dennis
1
@ xnor memperbaikinya.
Rod
Membuat perubahan kecil (mis. 6 potong dadu memiliki lebih banyak pembagi)
Jonathan Allan
6

Ruby , 56 48 byte

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

Cobalah online!

Bagaimana itu bekerja:

->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
}

Terima kasih Value Ink untuk ide yang menghemat 8 byte.

GB
sumber
Mengapa tidak cmulai saja dari 0 dan menghitung, alih-alih menjadikannya array yang Anda tambahkan semua faktor? Dengan begitu Anda menghilangkan kebutuhan untuk menggunakan sizepada akhirnya
Value Ink
Anda benar, itu karena saya menulis fungsi faktorisasi untuk tantangan lain dan saya menggunakannya kembali di sini.
GB
5

Mathematica, 31 29 byte

Tr[Last/@FactorInteger@#]==2&
JungHwan Min
sumber
4

Neim , 4 byte

𝐏𝐥δ𝔼

Cobalah online!

Okx
sumber
Bisakah Anda menjelaskan bagaimana ini 4 byte? ... Saya benar-benar bingung.
Tn. Xcoder
Lol Saya baru saja punya ini
HyperNeutrino
@ Mr.Xcoder Neim memiliki halaman kode khusus
JungHwan Min
@ Mr.Xcoder Menggunakan codepage Neim, ini 𝐏, 𝐥, δ, dan 𝔼sebagai single-byte.
HyperNeutrino
@HyperNeutrino Saya hanya mengaburkan 2 sedikit, dan sekarang ini adalah satu-satunya jawaban tanpa 2 :)
Okx
4

Python 2 , 67 byte

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]

Cobalah online!

-10 byte terima kasih kepada @JonathanAllan!

Kredit untuk algoritma faktorisasi Perdana diberikan kepada Dennis (dalam versi awal)

Tuan Xcoder
sumber
Apakah Anda menggunakan kode dari jawaban Dennis ? Jika demikian, Anda harus memberi kredit.
totallyhuman
1
@ benar-benar manusia Oh ya, maaf. Saya menggunakannya dalam 2 jawaban berbeda hari ini dan saya memberinya pujian di salah satu dari mereka, tetapi saya lupa melakukannya lagi di sini. Terima kasih telah melihatnya!
Tn. Xcoder
1
67 byte
Jonathan Allan
@ JonathanAllan Wow, terima kasih banyak!
Tn. Xcoder
55 byte
Halvard Hummel
4

JavaScript (ES6), 47 byte

Mengembalikan boolean.

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

Demo

Arnauld
sumber
4

Mathematica 32 byte

Berkat ngenesis selama 1 byte disimpan

Tr@FactorInteger[#][[;;,2]]==2&
DavidC
sumber
1
Simpan satu byte dengan menggunakan ;;alih-alih All.
ngenisis
3

Jelly , 5 byte

ÆfL=2

Cobalah online!

Penjelasan

ÆfL=2  Main link
Æf     Prime factors
  L    Length
   =   Equals
    2  2
HyperNeutrino
sumber
3

05AB1E, 4 byte

Òg2Q

Cobalah online!

Bagaimana?

Ò       prime factors list (with duplicates)
 g      length
   Q    equal to
  2     2
Uriel
sumber
3

MATL, 5 byte

Yfn2=

Cobalah online!

Penjelasan

  • Yf - Faktor utama.

  • n - Panjangnya.

  • 2= - Apakah sama dengan 2?

Tuan Xcoder
sumber
3

Dyalog APL, 18 byte

⎕CY'dfns'
2=≢3pco⎕

Cobalah online!

Bagaimana?

⎕CY'dfns' - impor pco

3pco⎕- berjalan pcodi input dengan argumen kiri 3 (faktor prima)

2=≢ - panjang = 2?

Uriel
sumber
3

Gaia , 4 byte

ḍl2=

4 byte sepertinya panjang yang umum, saya bertanya-tanya mengapa ...: P

Cobalah online!

Penjelasan

ḍ     Prime factors
 l    Length
  2=  Equals 2?
Kucing Bisnis
sumber
4 byte sepertinya panjang yang umum, saya bertanya-tanya mengapa ... - Mungkin karena semua jawaban adalah faktor utama, panjang, sama dengan 2?
Tn. Xcoder
@ MrXcoder Yap, tepatnya
Bisnis Cat
4 di antaranya milik saya BTW> _>
Mr. Xcoder
4 juga merupakan semiprime pertama. Menyeramkan!
Neil
3

Python dengan SymPy 1.1.1 ,  57  44 byte

-13 byte berkat alephalpha (gunakan 1.1.1's primeomega)

from sympy import*
lambda n:primeomega(n)==2

Cobalah online!

Jonathan Allan
sumber
lambda n:primeomega(n)==2
alephalpha
Ah itu mengingatkan saya untuk meningkatkan dari 1.0, terima kasih!
Jonathan Allan
3

R , 67 byte

c=0;n=scan();for(p in(1:n)[-1:-2]-1)while(n%%p<1){c=c+1;n=n/p};c==2

Cobalah online!

Biarawati Bocor
sumber
2

Rubi , 35 + 8 = 43 byte

Menggunakan -rprimebendera untuk membuka kunci prime_divisionfungsi.

->n{n.prime_division.sum(&:pop)==2}

Cobalah online!

Nilai Tinta
sumber
2

Java 8, 69 61 byte

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

-8 byte berkat @Nevay .

Coba di sini.

Kevin Cruijssen
sumber
1
Anda dapat menghapus pernyataan else (yang bisa jadi else++r;) untuk menyimpan 8 byte n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}.
Nevay
1

Python 2 , 75 65 byte

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

Cobalah online!

Semua kredit untuk jawaban xnor untuk kode faktorisasi prima asli.

benar-benar manusiawi
sumber
1

C #, 112 Bytes

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));}

Dengan pemformatan diterapkan:

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));
}

Dan sebagai program uji:

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 ();
        }
    }
}

Yang memiliki output:

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
MetaColon
sumber
1

Retina , 45 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

.+
$*

Konversikan ke unary.

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

Coba cari dua faktor.

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

Pastikan kedua faktor prima.

;

Pastikan dua faktor ditemukan.

Neil
sumber
1

Python 2, 90 byte

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

fmembutuhkan integer yang nlebih besar atau sama dengan 1, mengembalikan boolean.

Cobalah online!

Kasus uji:

>>> 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
nog642
sumber
1

J , 6 byte

5 byte akan berfungsi sebagai satu kali:

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

Saya percaya saya perlu enam ketika saya mendefinisikan fungsi:

   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
Dane
sumber
1

Japt , 6 5 byte

k ʥ2

Uji secara online


Penjelasan

Apakah hampir sama dengan sebagian besar jawaban lainnya: kdapatkan berbagai faktor utama, Êdapatkan panjangnya dan ¥periksa kesetaraannya 2.

Shaggy
sumber
÷k o)jjuga berfungsi, sayangnya panjangnya sama :-(
ETHproduk
0

Perl 6 , 43 byte

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

Cobalah online!

fadalah faktor terkecil yang lebih besar dari 1 argumen input $_, atau Niljika $_1. Nilai kembalinya fungsi true jika fbenar (yaitu, tidakNil ) DAN argumen input dibagi dengan faktor prima.

Jika $_itu sendiri prima, maka fakan sama dengan $_, dan $_ / fadalah 1, yang tidak prima, jadi rumusnya bekerja dalam kasus itu juga.

Sean
sumber