N-gons xây dựng


10

Một n-gon có thể xây dựng là một đa giác thông thường có n cạnh mà bạn có thể xây dựng chỉ với một la bàn và một thước kẻ không được đánh dấu.

Như Gauss đã nêu, n duy nhất mà n-gon có thể xây dựng được là một sản phẩm của bất kỳ số nguyên tố Fermat riêng biệt nào và lũy thừa là 2 (nghĩa là n = 2^k * p1 * p2 * ...kmột số nguyên và mỗi pmột số nguyên tố Fermat riêng biệt).

Một số nguyên tố Fermat là một số nguyên tố có thể được biểu thị dưới dạng F (n) = 2 ^ (2 ^ n) +1 với số nguyên dương. Số nguyên tố Fermat duy nhất được biết là cho 0, 1, 2, 3 và 4.

Các thách thức

Cho một số nguyên n>2, giả sử nếu n-gon có thể xây dựng được hay không.

Sự chỉ rõ

Chương trình hoặc hàm của bạn nên lấy một số nguyên hoặc một chuỗi đại diện cho số nguyên đã nói (ở dạng đơn nguyên, nhị phân, thập phân hoặc bất kỳ cơ sở nào khác) và trả về hoặc in một giá trị trung thực hoặc giả.

Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất sẽ thắng, sơ hở tiêu chuẩn được áp dụng.

OEIS có liên quan

Ví dụ

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

Câu trả lời:


8

Thạch , 7 5 byte

Cảm ơn Sp3000 đã lưu 2 byte.

ÆṪBSỊ

Sử dụng phân loại sau:

Đây cũng là những số mà phi (n) là lũy thừa của 2.

Trong đó phihàm tổng của Euler .

ÆṪ        # 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.

Hãy thử trực tuyến!

Ngoài ra (tín dụng cho 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.

Một cổng trực tiếp của câu trả lời Mathicala của tôi dài hơn hai byte:

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

Tôi không biết Jelly, nhưng có lẽ bạn có thể kiểm tra sức mạnh của 2 bằng cách bao thanh toán và kiểm tra nếu tối đa là 2? Bạn cũng có thể kiểm tra xem bitwise AND của nó và tiền thân của nó có bằng 0.
xnor

@xnor Hừm, ý kiến ​​hay nhưng những nỗ lực của tôi ở đó có cùng độ dài. Nếu có một cách để kiểm tra xem một danh sách có độ dài 1 trong ít hơn 3 byte hay không, thì nó sẽ ngắn hơn (bằng cách sử dụng hàm hệ số chỉ đưa ra danh sách các số mũ). Tôi không thể tìm ra cách để làm điều đó mặc dù.
Martin Ender

Tôi thấy có E để kiểm tra xem tất cả các yếu tố của danh sách có bằng nhau không. Điều gì sẽ xảy ra nếu bạn nhân đôi số lượng, tính hệ số và kiểm tra xem tất cả các yếu tố có bằng nhau không?
xnor

@xnor Đó cũng là một ý kiến ​​hay. :) Đó có thể là 6 byte sau đó, nhưng Sp3000 đã chỉ ra rằng có Bcho phép tôi kiểm tra nó trong 5.
Martin Ender

À, tốt quá. Bất kỳ cơ hội nào giảm, sau đó nhị phân, sau đó sản phẩm ngắn hơn?
xnor

3

Toán học, 24 byte

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

Sử dụng phân loại sau từ OEIS:

Có thể tính toán dưới dạng các số sao cho tổng số tương đương với tổng số tổng.

Các hàm Ơ-le φ(x) của một số nguyên xlà số nguyên dương bên dưới xđó là nguyên tố cùng nhau đến x. Cototient là số nguyên dương không có nghĩa là x-φ(x). Nếu tổng số bằng với cototient, điều đó có nghĩa là tổng số của φ(x) == x/2.

Việc phân loại đơn giản hơn

Đây cũng là những số mà phi (n) là lũy thừa của 2.

kết thúc là một byte dài hơn:

IntegerQ@Log2@EulerPhi@#&

Cototents và totents là gì? Và tỷ lệ cototient-of-totents và totient-of-totents?
clismique

@ Qwerp-Derp Tổng số nlà số nguyên bên dưới nlà số nguyên tố nvà cototient là số nguyên bên dưới nkhông có. Tôi sẽ chỉnh sửa trong một liên kết.
Martin Ender

Tích hợp sẵn của Mathematica sẽ không bao giờ dừng lại để làm tôi ngạc nhiên
Sefa

@ Qwerp-Derp Đối với câu hỏi thứ hai của bạn, điều đó chỉ có nghĩa là bạn tính tổng (đồng) của tổng số n.
Martin Ender

3

Võng mạc, 51 50 byte

0+$

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

Đầu vào là nhị phân. Hai dòng đầu tiên chia cho một lũy thừa hai, hai dòng tiếp theo chia cho tất cả các số nguyên tố Fermat đã biết (nếu thực tế, số này là sản phẩm của các số nguyên tố Fermat). Chỉnh sửa: Đã lưu 1 byte nhờ @Martin Ender ♦.


đầu vào nhị phân là tốt, cũng như giả định về số nguyên tố Fermat
Sefa

2

JavaScript (ES7), 61 byte

n=>[...Array(5)].map((_,i)=>n%(i=2**2**i+1)?0:n/=i)&&!(n&n-1)

1

Trên thực tế, 6 byte

Câu trả lời này dựa trên thuật toán của xnor trong câu trả lời Jelly của Martin Ender . Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

▒D├♂≈π

Làm thế nào nó hoạt động

         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

Mẻ, 97 byte

@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)"

Đầu vào là trên stdin ở dạng thập phân. Đây thực sự là 1 byte ngắn hơn so với việc tính toán sức mạnh của 2 lần lặp. Tôi đã lưu 1 byte bằng cách sử dụng sức mạnh 2 lần của @ xnor.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.