สร้าง n-gons


10

constructible n เหลี่ยมเป็นรูปเหลี่ยมปกติกับด้าน n ที่คุณสามารถสร้างมีเพียงเข็มทิศและผู้ปกครองที่ไม่มีเครื่องหมาย

ตามที่ระบุไว้โดย Gauss, n เท่านั้นที่ n-gon สามารถสร้างได้เป็นผลิตภัณฑ์ของจำนวนเฉพาะแฟร์มาต์ที่แตกต่างกันและพลังของ 2 (เช่น. n = 2^k * p1 * p2 * ...ด้วยkการเป็นจำนวนเต็มและทุกpไพร์มแฟร์เฉพาะ)

ไพร์มแฟร์มาต์เป็นไพร์มซึ่งสามารถแสดงเป็น F (n) = 2 ^ (2 ^ n) +1 ได้ด้วยจำนวนเต็มบวก นายกแฟร์มาต์ที่รู้จักกันเพียงคนเดียวคือ 0, 1, 2, 3 และ 4

ความท้าทาย

รับจำนวนเต็มn>2บอกว่า n-gon สามารถสร้างได้หรือไม่

สเปค

โปรแกรมหรือฟังก์ชั่นของคุณควรใช้จำนวนเต็มหรือสตริงที่แสดงถึงจำนวนเต็ม (ไม่ว่าจะเป็นเลขฐานสองเลขฐานสิบทศนิยมหรือฐานอื่น ๆ ) และส่งคืนหรือพิมพ์ค่าจริงหรือค่าเท็จ

นี่คือรหัสกอล์ฟเพื่อให้สั้นที่สุดชนะคำตอบช่องโหว่มาตรฐานใช้

OEIS ที่เกี่ยวข้อง

ตัวอย่าง

3 -> True
9 -> False
17 -> True
1024 -> True
65537 -> True
67109888 -> True
67109889 -> False

คำตอบ:


8

เยลลี่ , 7 5 ไบต์

ขอบคุณ Sp3000 สำหรับการบันทึก 2 ไบต์

ÆṪBSỊ

ใช้การจำแนกประเภทต่อไปนี้:

นี่คือตัวเลขที่ phi (n) เป็นกำลังของ 2

ที่ไหนพีคือtotient ฟังก์ชันออยเลอร์

ÆṪ        # Compute φ(n).
  B       # Convert to binary.
   S      # Sum bits.
    Ị     # Check whether it's less than or equal to 1. This can only be the
          # case if the binary representation was of the form [1 0 0 ... 0], i.e. 
          e# a power of 2.

ลองออนไลน์!

อีกทางหนึ่ง (เครดิตถึง xnor):

ÆṪ’BP
ÆṪ        # Compute φ(n).
  ’       # Decrement.
   B      # Convert to binary.
    P     # Product. This is 1 iff all bits in the binary representation are
          # 1, which means that φ(n) is a power of 2.

พอร์ตโดยตรงของคำตอบ Mathematica ของฉันมีความยาวสองไบต์:

ÆṪ        # Compute φ(n).
  µ       # Start a new monadic chain, to apply to φ(n).
   ÆṪ     # Compute φ(φ(n)).
      H   # Compute φ(n)/2.
     =    # Check for equality.

ฉันไม่รู้จักเจลลี่ แต่คุณสามารถตรวจสอบกำลังของ 2 ด้วยการแยกตัวประกอบและตรวจสอบว่าค่าสูงสุดคือ 2 หรือไม่ คุณสามารถตรวจสอบว่า bitwise AND ของมันและบรรพบุรุษของมันคือ 0
xnor

@ xnor หืมมมมมมม, ไอเดียดี แต่ความพยายามของฉันในระยะเวลาเดียวกัน หากมีวิธีการตรวจสอบว่ารายการมีความยาว 1 ในเวลาน้อยกว่า 3 ไบต์หรือไม่นั้นจะสั้นกว่า (โดยใช้ฟังก์ชันตัวแยกหน่วยที่ให้รายการเลขชี้กำลัง) ฉันหาทางทำไม่ได้
Martin Ender

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

@xnor นั่นเป็นความคิดที่ดีเช่นกัน :) นั่นอาจจะเป็น 6 ไบต์ แต่ Sp3000 ชี้ให้เห็นว่ามีBและให้ฉันทดสอบใน 5
Martin Ender

อ่า โอกาสใดที่การลดลงแล้วเป็นเลขฐานสองจากนั้นผลิตภัณฑ์จะสั้นลง?
xnor

3

Mathematica ขนาด 24 ไบต์

e=EulerPhi
e@e@#==e@#/2&

ใช้การจำแนกประเภทต่อไปนี้จาก OEIS:

คำนวณเป็นตัวเลขเช่นว่า cototient-of-totient เท่ากับ totient-of-totient

totient φ(x)ของจำนวนเต็มxคือจำนวนของจำนวนเต็มบวกด้านล่างxที่มี coprime xไป cototient x-φ(x)เป็นจำนวนของจำนวนเต็มบวกที่ไม่ได้คือ หาก totient เท่ากับ cototient ที่หมายความว่า totient φ(x) == x/2ของ

การจำแนกที่ตรงไปตรงมามากขึ้น

นี่คือตัวเลขที่ phi (n) เป็นกำลังของ 2

จบลงด้วยการเป็นไบต์อีกต่อไป:

IntegerQ@Log2@EulerPhi@#&

Cototients และ Totients คืออะไร และอัตราส่วน cototient-of-totients และ totient-of-totients หรือไม่
clismique

@ Qwerp-Derp totient of nคือจำนวนเต็มด้านล่างnที่เป็น coprime ถึงnและ cototient เป็นจำนวนเต็มด้านล่างnที่ไม่ใช่ ฉันจะแก้ไขลิงก์
Martin Ender

ในตัวของ Mathematica จะไม่หยุดทำให้ฉันประหลาดใจ
Sefa

@ Qwerp-Derp สำหรับคำถามที่สองของคุณมันก็หมายความว่าคุณคำนวณ (ร่วม) totient ของ totient nของ
Martin Ender

3

เรติน่า, 51 50 ไบต์

0+$

+`^(.*)(?=(.{16}|.{8}|....|..?)$)0*\1$
$1
^1$

อินพุตอยู่ในรูปแบบไบนารี เส้นสองเส้นแรกหารด้วยพลังของสอง, อีกสองหารด้วยจำนวนเฉพาะแฟร์มาต์ที่รู้จักกัน (ถ้าอันที่จริงแล้วจำนวนเป็นผลคูณของแฟร์มาต์) แก้ไข: บันทึก 1 ไบต์ขอบคุณ @Martin Ender ♦


การป้อนข้อมูลแบบไบนารีเป็นสิ่งที่ดีเช่นเดียวกับสมมติฐานเกี่ยวกับแฟร์มาต์
ฟา


1

ที่จริงแล้ว 6 ไบต์

คำตอบนี้จะขึ้นอยู่กับขั้นตอนวิธีการ XNOR ในมาร์ตินพลิกคำตอบวุ้น ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

▒D├♂≈π

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

         Implicit input n.
▒        totient(n)
 D       Decrement.
  ├      Convert to binary (as string).
   ♂≈    Convert each char into an int.
     π   Take the product of those binary digits.
         If the result is 1,
           then bin(totient(n) - 1) is a string of 1s, and totient(n) is power of two.

0

แบตช์ 97 ไบต์

@set/pn=
@for /l %%a in (4,-1,0)do @set/a"p=1<<(1<<%%a),n/=p*!(n%%-~p)+1"
@cmd/cset/a"!(n-1&n)"

อินพุตอยู่ใน stdin เป็นทศนิยม นี่คือ 1 ไบต์สั้นกว่าการคำนวณพลังของ 2 อย่างซ้ำ ๆ ฉันบันทึก 1 ไบต์โดยใช้การตรวจสอบกำลังของ @ xnor

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