มันคือ semiprime หรือไม่?


26

น่าแปลกที่ฉันไม่คิดว่าเรามีคำถามเกี่ยวกับเพื่อพิจารณาว่าตัวเลขนั้นเป็นครึ่งปีหรือไม่

semiprime เป็นจำนวนธรรมชาติที่เป็นผลคูณของจำนวนเฉพาะสองตัว (ไม่จำเป็นต้องแตกต่างกัน)

เรียบง่าย แต่มีแนวคิดที่สำคัญอย่างน่าทึ่ง

รับจำนวนเต็มบวกกำหนดว่าเป็น semiprime เอาต์พุตของคุณสามารถอยู่ในรูปแบบใดก็ได้ตราบใดที่ให้เอาต์พุตเดียวกันสำหรับค่าความจริงหรือเท็จ คุณอาจจะสมมติว่าข้อมูลที่คุณป้อนมีขนาดเล็กพอที่ประสิทธิภาพหรือล้นไม่ได้เป็นปัญหา

กรณีทดสอบ:

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
@WeatWizard คุณยกระดับจุดที่ดี แต่ในทำนองเดียวกันเรามีคำถามหลายประเภทอยู่แล้วและแม้ว่าในทางตรงกันข้ามกับสิ่งที่คุณแสดง แต่ส่วนใหญ่จะเพิ่มการสนับสนุนที่สำคัญไปยังพื้นที่ของพวกเขาคำถามนี้มีความแตกต่างเพียงพอ ฉันเชื่อว่ามันรับประกันคำถาม / โพสต์แยกต่างหาก
HyperNeutrino

2
@hyperneutrino ดูคำตอบของความท้าทายทั้งสองดูเหมือนว่าความแตกต่างคือหมายเลขเดียวในซอร์สโค้ด 2 vs 3 ฉันแทบจะเรียกได้ว่าความแตกต่างครั้งใหญ่
ข้าวสาลีตัวช่วยสร้าง

2
@WheatWizard นอกจากนี้ยังมี "ชัดเจน" vs "ไม่ชัดเจน" ...
HyperNeutrino

3
@ LordFarquaad เพียงเพราะซ้ำกันไม่ได้หมายความว่ามันไม่ดี ในความคิดของฉันการทำซ้ำเป็นสิ่งที่ดีหมายความว่าคุณกำลังถามสิ่งที่ชุมชนพบว่าน่าสนใจพอที่จะถามแล้ว
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


19

Brachylog ขนาด 2 ไบต์

โดยพื้นฐานแล้วพอร์ตจากคำตอบของ Fatalize ถึงความท้าทายหมายเลข Sphenic

ḋĊ

ลองออนไลน์!

อย่างไร?

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

1
ภาษาที่ถูกต้องสำหรับงานแน่นอน: P
HyperNeutrino

2
@Uriel Ċเป็นรายการตัวแปรสองตัวในตัว เป็นภาษาที่เปิดเผยออกเป็นตามค่าเริ่มต้นสำหรับการทดสอบความพึงพอใจ (เช่นบนจะเอาท์พุทของตัวเองtrue.สำหรับ integers เชิงลบ)
Jonathan Allan

2 ไบต์นี้เป็นอย่างไร
แฮโรลด์

1
@harold ฉันเพิ่งอัปเดตเพื่อให้ "ไบต์" ในลิงก์ส่วนหัวไปยังหน้ารหัสของ Brachylog c6 ebการถ่ายโอนข้อมูลฐานสิบหกจะเป็น
Jonathan Allan


8

Mathematica ขนาด 16 ไบต์

PrimeOmega@#==2&

PrimeOmega นับจำนวนของปัจจัยสำคัญ, การนับหลายหลาก


1
แดงมีตัวต่อหรือเปล่า?
JungHwan Min

1
@JungHwanMin ถ้าเพียง แต่มีSemiprimeQ
ngenisis

ดี ฉันไม่รู้PrimeOmega
DavidC


7

Python 3 , 54 ไบต์

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

ลองออนไลน์!

verson ก่อนหน้านี้มีปัญหาบางอย่างเกี่ยวกับการปัดเศษตัวเลขก้อนขนาดใหญ่ ( 125, 343ฯลฯ )
นี้จะคำนวณปริมาณของตัวหาร (ไม่ใช่เฉพาะช่วงเวลา) ถ้ามันมี1หรือจะส่งกลับ2 ข้อยกเว้นเพียงอย่างเดียวคือเมื่อตัวเลขมีปัจจัยสำคัญมากกว่าสองอย่าง แต่มีตัวหารสองตัวเท่านั้น ในกรณีนี้มันเป็นคิวบ์ที่สมบูรณ์แบบของไพรม์ (ตัวหารมันคือรูทคิวบ์และรูทคิวบ์ของมันกำลังสอง) จะครอบคลุมกรณีนี้การเพิ่มหนึ่งรายการในรายการรูทคิวบ์จะผลักดันผลรวมจนถึงจำนวน 3 และหยุดการบวกเท็จ ขอบคุณ Jonathan Allan ที่เขียนคำอธิบายที่สวยงามนี้True
x**3==n


การอ้างสิทธิ์นี้ 8 คือ semiprime
xnor

n**(1/3)%1>0<sum...ควรทำงาน.
เดนนิส

1
@ xnor แก้ไข
ร็อด

ทำการแก้ไขเล็กน้อย (เช่น 6 cubed มีตัวหารอื่น ๆ อีกมากมาย)
Jonathan Allan

6

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

ขอบคุณ Value Ink สำหรับแนวคิดที่บันทึกไว้ 8 ไบต์


ทำไมไม่เพียงแค่cเริ่มต้นที่ 0 และนับขึ้นแทนที่จะทำให้มันเป็นอาร์เรย์ที่คุณเพิ่มปัจจัยทั้งหมดลงไป? ด้วยวิธีนี้คุณจะต้องใช้งานsizeในตอนท้าย
Value Ink

คุณพูดถูกเพราะฉันเขียนฟังก์ชันการแยกตัวประกอบสำหรับความท้าทายอื่นและฉันนำมันกลับมาใช้ใหม่ที่นี่
GB


4

Neim , 4 ไบต์

𝐏𝐥δ𝔼

ลองออนไลน์!


คุณช่วยอธิบายได้ว่านี่คือ 4 ไบต์หรือไม่ ... ฉันสับสนโดยสิ้นเชิง
Mr. Xcoder

ฉันเพิ่งได้รับสิ่งนี้
HyperNeutrino


@ Mr.Xcoder ใช้เพจรหัส Neim นี้เป็น𝐏, 𝐥, δและ𝔼เป็นคนเดียวไบต์
HyperNeutrino

@HyperNeutrino ฉันเพียงแค่ obfuscated 2 นิด ๆ หน่อย ๆ และตอนนี้เป็นคำตอบเดียวโดยไม่ต้อง 2 :)
Okx

4

Python 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]

ลองออนไลน์!

-10 ไบต์ขอบคุณ @JonathanAllan!

เครดิตสำหรับอัลกอริธึมการแยกตัวประกอบเฉพาะของไปที่เดนนิส (ในเวอร์ชั่นเริ่มต้น)


คุณใช้รหัสจากคำตอบของเดนนิสหรือไม่ ถ้าเป็นเช่นนั้นคุณควรให้เครดิต
สิ้นเชิงมนุษย์

1
@tallyallyhuman โอ้ใช่ขอโทษ ฉันใช้มันในคำตอบที่แตกต่างกัน 2 ข้อในวันนี้และฉันให้เครดิตเขากับหนึ่งในนั้น แต่ฉันลืมที่จะทำเช่นนั้นอีกครั้งที่นี่ ขอบคุณที่จำได้!
Mr. Xcoder


@JanathanAllan ว้าวขอบคุณมาก!
Mr. Xcoder



4

Mathematica 32 ไบต์

ขอบคุณ ngenesis ที่บันทึกไว้ 1 ไบต์

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

1
บันทึกหนึ่งไบต์โดยใช้แทน;; All
ngenisis






3

Gaiaขนาด 4 ไบต์

ḍl2=

ดูเหมือนว่า 4 ไบต์จะมีความยาวร่วมกันฉันสงสัยว่าทำไม ... : P

ลองออนไลน์!

คำอธิบาย

ḍ     Prime factors
 l    Length
  2=  Equals 2?

4 ไบต์ดูเหมือนจะเป็นความยาวร่วมกันฉันสงสัยว่าทำไม ... - อาจเป็นเพราะคำตอบทั้งหมดเป็นปัจจัยสำคัญความยาวเท่ากับ 2?
Mr. Xcoder

@MrXcoder อ๋อแน่นอน
Business Cat

4 ซึ่งเป็นของฉัน BTW> _>
นาย Xcoder

4 ยังเป็น semiprime แรก น่ากลัว!
Neil




2

Java 8, 69 61 ไบต์

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

-8 ไบต์ต้องขอบคุณ@Nevay

ลองที่นี่


1
คุณสามารถลบคำสั่งอื่น (ซึ่งอาจจะเป็น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

Python 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

fรับจำนวนเต็มnมากกว่าหรือเท่ากับ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

ฉันเชื่อว่าฉันต้องการหกเมื่อฉันกำหนดฟังก์ชั่น:

   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

Japtap , 6 5 ไบต์

k ʥ2

ทดสอบออนไลน์


คำอธิบาย

ไม่สวยมากเหมือนกันเป็นส่วนใหญ่ของคำตอบอื่น ๆ : kได้รับอาร์เรย์ของปัจจัยสำคัญที่Êได้รับความยาวและการตรวจสอบเพื่อความเท่าเทียมกันด้วย¥2


÷k o)jยังใช้งานได้ แต่น่าเสียดายที่มันมีความยาวเท่ากัน :-(
ETHproductions

0

Perl 6 , 43 ไบต์

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

ลองออนไลน์!

fเป็นปัจจัยที่เล็กที่สุดที่มากกว่า 1 ของอาร์กิวเมนต์ที่ป้อนเข้า$_หรือNilถ้า$_เป็น 1 ค่าส่งคืนของฟังก์ชันจะเป็นจริงถ้าfเป็นจริง (เช่นไม่ใช่Nil ) และอาร์กิวเมนต์ของอินพุตจะถูกหารด้วยปัจจัยนั้นสำคัญ

หาก$_ตัวเองดีเลิศแล้วก็fจะเท่ากับ$_และ$_ / fเป็น 1 ซึ่งไม่สำคัญดังนั้นสูตรจะทำงานในกรณีนั้นเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.