วิธีการกำหนดค่าช่วงเวลาต่าง ๆ


32

หนึ่งในคำจำกัดความที่ฉันชื่นชอบของตัวเลขที่สำคัญไปดังนี้:

  • 2 เป็นนายกที่เล็กที่สุด

  • ตัวเลขที่มีขนาดใหญ่กว่า 2 นั้นเป็นจำนวนเฉพาะถ้าพวกเขาไม่สามารถหารด้วยจำนวนที่น้อยกว่าได้

อย่างไรก็ตามคำจำกัดความนี้ดูเผินๆทำไม 2 ทำไมไม่ใช้หมายเลขอื่นล่ะ? ลองมาดูตัวเลขอื่น ๆ หน่อยสิจะนิยาม n-prime แบบนั้น

  • n เป็น n-prime ที่เล็กที่สุด

  • ตัวเลขที่มีขนาดใหญ่กว่า n คือ n-prime หากพวกเขาไม่สามารถหารด้วย n-prime ที่เล็กกว่า

งาน

งานนี่คือการเขียนโปรแกรมที่จะใช้เวลาสองปัจจัยการผลิตเป็นจำนวนเต็มบวกnและเป็นจำนวนเต็มบวก จากนั้นจะตัดสินใจว่าaคือn -prime โปรแกรมของคุณควรแสดงค่าที่แตกต่างกันสองค่าสำหรับ "ใช่มันคือ n-prime" และอีกค่าสำหรับ "ไม่ใช่มันไม่ใช่ n-prime"

นี่เป็นคำถามเกี่ยวกับการเขียนโค้ดดังนั้นคำตอบจะได้คะแนนเป็นไบต์โดยไบต์น้อยจะดีขึ้น

การทดสอบ

นี่คือรายการของ 31 งวดแรกสำหรับ n = 2 ถึง n = 12 (1 คือหมายเลข 1 หลักเท่านั้น)

n=2: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=3: [3,4,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=4: [4,5,6,7,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=5: [5,6,7,8,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=6: [6,7,8,9,10,11,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=7: [7,8,9,10,11,12,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=8: [8,9,10,11,12,13,14,15,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=9: [9,10,11,12,13,14,15,16,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=10: [10,11,12,13,14,15,16,17,18,19,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=11: [11,12,13,14,15,16,17,18,19,20,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=12: [12,13,14,15,16,17,18,19,20,21,22,23,25,27,29,31,33,35,37,41,43,47,49,53,55,59,61,67,71,73,77]

4
n=6, a=15เป็นกรณีทดสอบครั้งแรกที่น่าสนใจ
Neil

6
มันเป็นสถานที่แรกที่รูปแบบที่ไม่ใช่ "a คือ n-prime iff n≤a <2n หรือ (a≥2nและ a is prime)" แบ่งออกเป็น
Misha Lavrov

2
"ตัวเลขที่มีขนาดใหญ่กว่า 2 เป็นจำนวนเฉพาะถ้าไม่มีตัวหารที่มีขนาดเล็กกว่า" - คำจำกัดความนี้อนุญาตให้ใช้หมายเลขใด ๆ ก็ได้ บางทีคุณอยากจะพูดคำว่าiffแทนif ?

5
@ThePirateBay ฉันไม่ได้หมายถึงความรู้สึกทางคณิตศาสตร์ที่แม่นยำของคำว่าถ้า ฉันจะทิ้งมันไป
ข้าวสาลีตัวช่วยสร้าง

1
@JeppeStigNielsen มันไม่ยากมากที่จะพิสูจน์เรื่องนี้ ตัวเลขรวมทั้งหมดที่เป็น n-prime ต้องมีเฉพาะปัจจัยที่มีขนาดเล็กกว่า n เท่านั้น นอกจากนี้เรายังทราบว่าไม่มีส่วนย่อยของปัจจัยใดที่สามารถมีผลิตภัณฑ์ที่ใหญ่กว่า n เนื่องจากจำนวนของเราจะหารด้วย ดังนั้นทุก n-prime คือ 2-prime หรือผลิตภัณฑ์ที่มีตัวเลข 2 ตัวน้อยกว่า n มีจำนวน จำกัด ของการจับคู่ของตัวเลขน้อยกว่า n ดังนั้นจึงมีเพียงจำนวน จำกัด ของตัวเลขคอมโพสิต n-prime หวังว่ามันสมเหตุสมผลนะฉันต้องย่อให้พอดีในคอมเม้น
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


9

Haskell , 45 ไบต์

n!a=not$any(n!)[x|x<-[n..a-1],mod a x<1]||n>a

ลองออนไลน์!

ฉันกำหนดฟังก์ชั่นเวียนเกิดที่ดี(!):

n!aตรวจสอบว่าปัจจัยใด ๆaในช่วงเป็น[n,a-1] n-primeจากนั้นจะลบล้างผลลัพธ์ นอกจากนี้ยังทำให้แน่ใจได้ว่าn>a



@Weateat ฉันหวังว่าจะมีคนโพสต์โซลูชันที่สั้นกว่า :)
H.PWiz


4

Python 3 , 45 ไบต์

lambda i,k:(i>k)<all(k%r for r in range(i,k))

ลองออนไลน์!

มันทำงานอย่างไร

นี้จะใช้เวลาสองจำนวนเต็มเป็น input ฉันและk ตรวจสอบก่อนหากk ≥ฉัน จากนั้นสร้างช่วง[i, k)และสำหรับแต่ละจำนวนเต็มNในช่วงนี้ให้ตรวจสอบว่าNเป็น coprime ถึงkหรือไม่ หากเงื่อนไขทั้งสองเป็นจริงkจะเป็นi -prime


คุณไม่สามารถใช้&แทนandและ>=iแทนที่จะเป็นได้>i-1หรือไม่
ข้าวสาลี Wizard

@WheatWizard >=i ยังคงเป็น 4 ไบต์ (เนื่องจากพื้นที่)
Neil

@ Neil หากคุณเปลี่ยน&คุณไม่ต้องการพื้นที่
ข้าวสาลี Wizard


4

R , 44 37 ไบต์

function(a,n)a==n|a>n&all(a%%n:(a-1))

ลองออนไลน์!

-7 ไบต์ขอบคุณGiuseppe

ส่งคืนTRUEถ้า

  • aเท่ากับnหรือ ( a==n|)
  • aมีค่ามากกว่าn และ ( a>n&) หมายเลขทุกkจากnไปa-1, aไม่หารเท่า ๆ กันโดยk ( all(a%%n:(a-1)))

ส่งคืนFALSEอย่างอื่น


ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี!
FantaC

3

J, 30 ไบต์

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:

ลองออนไลน์!

รับค่าเริ่มต้นเป็นอาร์กิวเมนต์ที่ถูกต้องและค่าที่จะตรวจสอบที่อาร์กิวเมนต์ซ้าย

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

คำอธิบาย

อนุญาตxเป็นอาร์กิวเมนต์ซ้าย (ค่าที่ต้องการตรวจสอบ) และyเป็นอาร์กิวเมนต์ที่ถูกต้อง (ไพรม์เริ่มต้น)

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:
                          ^:>:  Execute left argument if x >= y
                     i.@[         Create range [0..x]
                   ]+             Add y to it (range now: [y..x+y])
                |/~               Form table of residues
            0=                    Equate each element to 0
          +/                      Sum columns
      1=                          Equate to 1
    -{                            Take the element at position x-y
>:*                             Multiply by result of x >= y

หมายเหตุ

องค์ประกอบที่ตำแหน่งx-yคือผลลัพธ์ของการทดสอบแบบดั้งเดิมสำหรับx(เนื่องจากเราเพิ่มลงyในช่วงต้นฉบับ)

คูณด้วยx >: yเพื่อให้แน่ใจว่าเราได้รับค่า falsey ( 0) สำหรับน้อยกว่าxy


3

JavaScript (ES6), 33 32 30 ไบต์

(n)(a)จะเข้าในไวยากรณ์ currying ส่งคืนบูลีน

n=>p=(a,k=a)=>k%--a?p(a,k):a<n

การสาธิต


3

Haskell 30 ไบต์

2 ไบต์บันทึกไว้ด้วยความคิดของ H.PWiz ที่ยืมมาจากคำตอบของข้อบกพร่อง

n!a=[1]==[1|0<-mod a<$>[n..a]]

ลองออนไลน์!

Ok since its been a while, and the only Haskell answer so far is 45 btyes, I decided to post my own answer.

Explanation

This function checks that the only number between n and a that a is divisible by is a itself.

Now the definition only mentions n-primes smaller than a, so why are we checking all these extra numbers? Won't we have problems when a is divisible by some n-composite larger than n?

We won't because if there is an n-composite larger than n it must be divisible by a smaller n-prime by definition. Thus if it divides a so must the smaller n-prime.

If a is smaller than n [n..a] will be [] thus cannot equal [1] causing the check to fail.





1

dc, 40 34 37 bytes

[0p3Q]sf?se[dler%0=f1+dle>u]sudle>u1p

I would have included a TIO link, but TIO seems to be carrying a faulty distribution of dc seeing as how this works as intended on my system but the Q command functions erroneously on TIO. Instead, here is a link to a bash testing ground with a correctly functioning version of dc:

Demo It!


1

APL (Dyalog), 24 bytes

{⍵∊o/⍨1=+/¨0=o|⍨⊂o←⍺↓⍳⍵}

Try it online!

How?

⍳⍵ - 1 to a

o←⍺↓ - n to a, save to o

o|⍨⊂o - modulo every item in o with every item in o

0= - check where it equals 0 (divides)

+/¨ - sum the number of divisions

1= - if we have only one then the number is only divided by itself

o/⍨ - so we keep these occurences

⍵∊ - is a in that residual array?




0

Add++, 20 bytes

L,2Dx@rBcB%B]b*!!A>*

Try it online!

L,   - Create a lambda function
     - Example arguments:  [5 9]
  2D - Copy below; STACK = [5 9 5]
  x  - Repeat;     STACK = [5 9 [9 9 9 9 9]]
  @  - Reverse;    STACK = [[9 9 9 9 9] 5 19] 
  r  - Range;      STACK = [[9 9 9 9 9] [5 6 7 8 9]]
  Bc - Zip;        STACK = [[9 5] [9 6] [9 7] [9 8] [9 9]]
  B% - Modulo;     STACK = [4 3 2 1]
  B] - Wrap;       STACK = [[4 3 2 1]]
  b* - Product;    STACK = [24]
  !! - Boolean;    STACK = [1]
  A  - Arguments;  STACK = [1 5 9]
  >  - Greater;    STACK = [1 1]
  *  - Product;    STACK = [1]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.