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!


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

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


8

Mathematica, 16 byte

PrimeOmega@#==2&

PrimeOmega menghitung jumlah faktor prima, menghitung multiplisitas.


1
Dang, ada builtin?
JungHwan Min

1
@JungHwanMin Kalau saja adaSemiprimeQ
ngenisis

Bagus. Saya tidak tahuPrimeOmega
DavidC


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


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.


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



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)


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


@ JonathanAllan Wow, terima kasih banyak!
Tn. Xcoder


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


4

Mathematica 32 byte

Berkat ngenesis selama 1 byte disimpan

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

1
Simpan satu byte dengan menggunakan ;;alih-alih All.
ngenisis





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?


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?

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




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.


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

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


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.


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

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


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.


÷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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.