Bir semiprime mi?


26

Şaşırtıcı bir şekilde, bir sayının yarı yarıya olup olmadığını belirlemek için bir sorusu olduğunu sanmıyorum .

Bir yarı sayı, iki (zorunlu olarak farklı) asal sayıların ürünü olan doğal bir sayıdır.

Yeterince basit, ama oldukça önemli bir kavram.

Olumlu bir tamsayı verildiğinde, bunun bir yarı süre olup olmadığını belirleyin. Çıktınız, herhangi bir gerçek veya falsey değeri için aynı çıktıyı verdiği sürece herhangi bir biçimde olabilir. Ayrıca, girişinizin, performans veya taşma sorun olmayacak kadar küçük olduğunu da varsayabilirsiniz.

Test durumları:

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

Bu , yani standart kurallar geçerlidir!


4
@WheatWizard Birinin 3 üssü istediğinden (hemen hemen tüm diller için büyük bir fark değil) ve bunun yalnızca farklı üsler için (bazı diller için oldukça farklı) bir miktar farkı var. Daha ayrıntılı bir tartışmaya devam etmek istiyorsanız, sizinle sohbet içinde görüşebilirim.
HyperNeutrino

2
@WheatWizard İyi bir noktaya değiniyorsunuz, ancak benzer şekilde, zaten birçok soru türümüz var ve ifade ettiklerinizin aksine, çoğu, kendi alanlarına önemli katkılar sağlasa da, bu sorunun yeterince farklı olmasına rağmen Bunun ayrı bir soru / posta emri verdiğine inanıyorum
HyperNeutrino

2
@ hyperneutrino, her iki zorluğun cevaplarına bakarken, fark kaynak koddaki tek bir sayı, 2'ye 3 gibi görünüyor.
Buğday Sihirbazı,

2
@WheatWizard Ayrıca "farklı" vs "farklı değil" ...
HyperNeutrino

3
@LordFarquaad Sadece bir kopyası olduğu için onun kötü olduğu anlamına gelmez. Aklımda yinelenen olmak iyi bir şey, bu, topluluğun daha önce sormak için yeterince ilginç bulduğu bir şey sorduğunuz anlamına geliyor.
Buğday Sihirbazı,

Yanıtlar:


19

Brachylog , 2 bayt

Temelde Fatalize'in Sphenic sayı yarışmasına vereceği yanıttan bir bağlantı noktası .

ḋĊ

Çevrimiçi deneyin!

Nasıl?

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

1
Gerçekten iş için doğru dil: P
HyperNeutrino

2
@Uriel Ċaslında iki değişkenli yerleşik bir listedir; bildirimsel bir dil olarak çıktı, varsayılan olarak, memnuniyet testidir (örneğin , tek başına true.negatif olmayan tamsayılar için çıktı olacaktır ).
Jonathan Allan

Bu 2 bayt nasıl?
08

1
@harold Sadece Brachylog kod sayfasının başlığında "bayt" yapmak için güncelleme yaptım. Bir altıgen dökümü olurdu c6 eb.
Jonathan Allan


8

Mathematica, 16 bayt

PrimeOmega@#==2&

PrimeOmega asal çarpanların sayısını sayarak çokluğu sayar.


1
Dang, yerleşik var mı?
JungHwan Min,

1
@JungHwanMin Keşke orada olsaydıSemiprimeQ
ngenisis

Güzel. BilmiyordumPrimeOmega
DavidC


7

Python 3 , 54 bayt

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

Çevrimiçi deneyin!

Bir önceki verson büyük küp sayılar (bazı yuvarlama sorunlar vardı 125, 343vs.)
Bu bölenler miktarını (sadece asal) o varsa, hesaplar 1veya 2döndürür True.
Bunun tek istisnası, bir sayının ikiden fazla asal faktöre sahip olması, ancak sadece iki bölen olmasıdır. Bu durumda mükemmel bir küp küptür (bölenler küp kökü ve küp kökü karesidir). x**3==nbu durumu kapsayacak, küp kök girişine bir tane eklemek, toplamı 3'e kadar iter ve yanlış-pozitifliği durdurur. Bu güzel açıklama ile yazmak için teşekkürler Jonathan Allan


Bu iddia 8, yarı sayıdır
xnor

n**(1/3)%1>0<sum...çalışmalı.
Dennis,

1
@ xnor düzeltti.
Rod

Küçük bir düzenleme yaptım (örneğin, 6 cubed'de daha fazla bölen var)
Jonathan Allan

6

Ruby , 56 48 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır:

->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 bayt kazandıran fikir için Teşekkürler Mürekkep.


Neden ctüm faktörleri ekleyeceğiniz bir dizi yapmak yerine sadece 0'dan başlayıp saymadı? Bu sayede sizesonunda kullanım ihtiyacını ortadan
Değerli Mürekkep

Haklısın, çünkü faktoring işlevini başka bir zorluk için yazdım ve burada yeniden kullandım.
GB



4

Python 2,67 bayt

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]

Çevrimiçi deneyin!

-JonathanAllan sayesinde -10 bayt!

Asal çarpanlara ayırma algoritması için kredi Dennis'e (ilk sürümde) gider


Dennis'in cevabındaki kodu kullandın mı? Eğer öyleyse, kredi vermelisin.
26'da

1
@totallyhuman Oh evet, üzgünüm. Bugün 2 farklı cevapta kullandım ve bunlardan birinde ona kredi verdim, ancak bir kez daha yapmayı unuttum. Bunu tespit ettiğin için teşekkürler!
Bay Xcoder


@ JonathanAllan Vay, çok teşekkürler!
Bay Xcoder


4

JavaScript (ES6), 47 bayt

Bir boole döndürür.

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

gösteri


4

Mathematica 32 bayt

1 byte için ngenesis sayesinde kaydedildi

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

1
Kullanarak bir bayt kaydet ;;yerine All.
ngenis,





3

Dyalog APL, 18 bayt

⎕CY'dfns'
2=≢3pco⎕

Çevrimiçi deneyin!

Nasıl?

⎕CY'dfns' - ithalat pco

3pco⎕- pcosol argüman 3 ile girdiyi çalıştır (asal çarpanlar)

2=≢ - uzunluk = 2?


3

Gaia , 4 bayt

ḍl2=

4 bayt ortak bir uzunluk gibi görünüyor, neden acaba ...: P

Çevrimiçi deneyin!

açıklama

ḍ     Prime factors
 l    Length
  2=  Equals 2?

4 bayt ortak bir uzunluk gibi görünüyor, nedenini merak ediyorum ... - Muhtemelen tüm cevaplar asal faktörler, uzunluk, 2'ye eşit olduğu için?
Bay Xcoder

@MrXcoder Yep, tam olarak
Business Cat

Bunlardan 4 tanesi benim BTW> _>
Bay Xcoder

4 aynı zamanda ilk yarı yarıyıldır. Ürpertici!
Neil




2

Java 8, 69 61 bayt

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

@Nevay sayesinde -8 bayt .

Burada dene.


1
else++r;8 bayttan tasarruf etmek için else ifadesini (olabilir) kaldırabilirsiniz n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}.
Nevay


1

C #, 112 Bayt

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

Biçimlendirme uygulandığında:

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

Ve test programı olarak:

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

Hangi çıktı var:

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 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

.+
$*

Birliğe dönüştür.

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

İki faktör bulmaya çalışın.

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

Her iki faktörün de asıl olduğundan emin olun.

;

İki faktörün bulunduğundan emin olun.


1

Python 2,90 bayt

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

fneşit veya daha büyük bir tamsayı alır 1, boolean döndürür.

Çevrimiçi deneyin!

Test durumları:

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

5 bayt bir kereye mahsus olarak çalışacak:

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

Fonksiyonu tanımlarken altıya ihtiyacım olduğuna inanıyorum:

   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

Perl 6 , 43 bayt

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

Çevrimiçi deneyin!

fgiriş argüman 1'den küçük bir faktör daha büyüktür $_ya da Nileğer $_1'dir işlevin dönüş değeri bu durum geçerlidir fgeçerlidir (yani, Nil) ve faktörü ile bölünen giriş argüman asal.

Eğer $_kendisi asal sonra feşit olacaktır $_ve $_ / fformül de bu durumda çalışır, böylece asal değildir ki, 1'dir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.