Một tình huống có nhiều nút


35

Dựa vào ký hiệu của Dowker về một nút thắt và các dấu chéo của nó, hãy tính đa thức khung của nó.

Mặc dù có nhiều định nghĩa kỹ thuật hơn, nhưng đối với thử thách này, đủ để nghĩ về một nút thắt như một thứ gì đó được tạo ra bằng cách gắn hai đầu của một chuỗi với nhau. Vì các nút thắt tồn tại trong ba chiều, khi chúng ta vẽ chúng trên giấy, chúng ta sử dụng sơ đồ nút thắt - các hình chiếu hai chiều trong đó các giao điểm có chính xác hai dòng, một trên và một dưới.

nhập mô tả hình ảnh ở đây

Ở đây (b) và (c) là các sơ đồ khác nhau của cùng một nút.

Làm thế nào để chúng ta đại diện cho một sơ đồ nút trên giấy? Hầu hết chúng ta không Rembrandt, vì vậy chúng tôi dựa vào ký hiệu của Dowker , hoạt động như sau:

Chọn một điểm bắt đầu tùy ý trên nút thắt. Di chuyển theo hướng tùy ý dọc theo nút thắt và đánh số các giao cắt bạn gặp phải, bắt đầu từ 1, với sửa đổi sau: nếu đó là số chẵn và bạn hiện đang đi qua giao lộ, hãy phủ định số chẵn đó. Cuối cùng, chọn các số chẵn tương ứng với 1, 3, 5, v.v.

Hãy thử một ví dụ:

nhập mô tả hình ảnh ở đây

Trên nút thắt này, chúng tôi đã chọn "1" làm điểm bắt đầu và tiến lên phía bên phải. Mỗi khi chúng ta đi qua hoặc dưới một đoạn dây khác, chúng ta gán điểm giao nhau cho số tự nhiên tiếp theo. Chúng tôi phủ định các số chẵn tương ứng với các chuỗi đi qua một giao thoa, ví dụ như [3,-12]trong sơ đồ. Vì vậy, sơ đồ này sẽ được đại diện bởi [[1,6],[2,5],[3,-12],[-4,9],[7,8],[-10,11]]. Liệt kê những người bạn của 1, 3, 5, 7, vv cho chúng ta [6,-12,2,8,-4,-10].

Có một vài điều cần lưu ý ở đây. Đầu tiên, ký hiệu Dowker không phải là duy nhất cho một nút cho trước, vì chúng ta có thể chọn điểm bắt đầu và hướng tùy ý. Nhưng, với ký hiệu, người ta hoàn toàn có thể xác định cấu trúc của nút (về mặt kỹ thuật, cho đến sự phản ánh của các thành phần nút chính của nó). Mặc dù không phải tất cả các ký hiệu của Dowker đều có thể hình thành các nút thắt có thể, nhưng trong vấn đề này, bạn có thể giả sử rằng đầu vào đại diện cho một nút thắt thực tế.

Để tránh sự mơ hồ giữa các phản xạ của nút thắt và để giải quyết thách thức dễ dàng hơn, bạn cũng sẽ được cung cấp một danh sách các dấu hiệu giao nhau làm đầu vào.

nhập mô tả hình ảnh ở đây

Trong một đường chéo tích cực, đường dưới đi về bên trái từ quan điểm của đường trên. Trong một giao thoa tiêu cực, nó đi bên phải. Lưu ý rằng đảo ngược hướng đi xung quanh nút thắt (nghĩa là đảo ngược cả đường trên và đường dưới ) không làm thay đổi các dấu hiệu giao nhau. Trong ví dụ của chúng tôi các dấu hiệu chéo là [-1,-1,-1,1,-1,1]. Chúng được đưa ra theo thứ tự giống như ký hiệu của Dowker, tức là đối với các giao cắt được đánh số 1, 3, 5, 7, v.v.

Trong thử thách này, chúng tôi sẽ tính toán đa thức khung của một nút. Đó là một đối tượng bất biến trên hầu hết sự biến đổi của sơ đồ nút thắt - một khái niệm làm cho nó cực kỳ hữu ích trong phân tích lý thuyết nút. (Một lần nữa, hầu hết các nhà lý thuyết nút thắt tính toán đa thức khung là một sản phẩm trung gian trên con đường của họ để tính toán đa thức Jones, bất biến trên tất cả các phép biến đổi, nhưng chúng ta sẽ không làm điều đó.) Vậy nó hoạt động như thế nào? Đa thức khung là một đa thức Laurent - một trong đó biến (có tên truyền thống là ) có thể được nâng lên thành lũy thừa âm, cũng như dương.Một

Đối với sơ đồ nút cho trước , ba quy tắc cho đa thức, được biểu diễn dưới dạng , là:DD

nhập mô tả hình ảnh ở đây

  1. Một vòng lặp duy nhất không có bất kỳ giao cắt nào có đa thức 1.

  2. Nếu chúng ta có một sơ đồ bao gồm và một vòng lặp bị ngắt kết nối với , thì đa thức cho cả hai là đa thức cho lần .DDD(-Một2-Một-2)

  3. Quy tắc này là khó khăn nhất. Nó nói rằng nếu bạn có một giao thoa trong trông giống như vậy , thì bạn có thể sử dụng quy tắc này để đơn giản hóa các nút thắt theo hai cách khác nhau:Dnhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Trong hình trên, đường chéo được phác thảo trong sơ đồ đầu tiên, có dạng nhập mô tả hình ảnh ở đây, có thể được chuyển thành nhập mô tả hình ảnh ở đâynhư trong hình thứ hai (còn gọi là làm mịn dương ) hoặc nhập mô tả hình ảnh ở đâynhư trong hình thứ ba ( làm mịn âm ).

Vì vậy, đa thức khung của sơ đồ thứ nhất là đa thức khung của lần thứ hai cộng với lần thứ ba , nghĩa là,MộtMột-1

nhập mô tả hình ảnh ở đây

Bối rối chưa? Hãy làm một ví dụ, cố gắng tìm đa thức khung của nhập mô tả hình ảnh ở đây(Lưu ý: đây là hai nút được liên kết với nhau. Loại sơ đồ này sẽ không phải là đầu vào tiềm năng trong thử thách này vì các đầu vào sẽ chỉ là các nút đơn, nhưng nó có thể xuất hiện dưới dạng một nút kết quả trung gian trong thuật toán.)

Đầu tiên chúng ta sử dụng quy tắc 3

nhập mô tả hình ảnh ở đây

Chúng tôi sử dụng quy tắc 3 một lần nữa trên cả hai nút thắt mới

nhập mô tả hình ảnh ở đây

Chúng tôi thay thế 4 nút thắt mới vào phương trình đầu tiên.

nhập mô tả hình ảnh ở đây

Áp dụng quy tắc 1 và 2 cho 4 điều này cho chúng tôi biết

nhập mô tả hình ảnh ở đây

Vì vậy, điều này cho chúng tôi biết

nhập mô tả hình ảnh ở đây

Chúc mừng bạn đã hoàn thành phần giới thiệu ngắn gọn về lý thuyết nút thắt!

Đầu vào

Hai danh sách:

  • Ký hiệu Dowker, vd [6,-12,2,8,-4,-10]. Việc đánh số các giao cắt phải bắt đầu từ 1. Các số lẻ tương ứng [1,3,5,7,...]được ẩn và không được cung cấp làm đầu vào.

  • Dấu hiệu ( 1/ -1hoặc nếu bạn thích 0/ 1hoặc false/ truehoặc '+'/ '-') cho các giao cắt tương ứng với ký hiệu Dowker, ví dụ [-1,-1,-1,1,-1,1].

Thay vì một cặp danh sách, bạn có thể có một danh sách các cặp, ví dụ: [[6,-1],[-12,-1],...

Đầu ra

In hoặc trả về đa thức, ví dụ , dưới dạng danh sách các cặp số mũ (hoặc cặp hệ số mũ) theo thứ tự tăng dần của số mũ và không có bất kỳ hệ số 0 nào, vd .Một-2+5+Một-Một3[[1,-2],[5,0],[1,1],[-1,3]]

Ngoài ra, hãy đưa ra một danh sách các hệ số tương ứng có độ dài lẻ cho số mũ cho một số , vd . Phần tử trung tâm là số hạng không đổi (hệ số trước ). Các phần tử ngoài cùng bên phải và không phải là cả 0.k N A 0-kGiáo dụckkN[0,1,0,5,1,0,-1]Một0

Quy tắc

Đây là một thách thức . Không có lỗ hổng tiêu chuẩn nào có thể được sử dụng và các thư viện có các công cụ để tính toán các ký hiệu Dowker hoặc đa thức ngoặc, không thể được sử dụng. (Một ngôn ngữ có chứa các thư viện này vẫn có thể được sử dụng, không phải là các thư viện / gói).

Xét nghiệm

// 4-tuples of [dowker_notation, crossing_signs, expected_result, description]
[
 [[],[],[[1,0]],"unknot"],
 [[2],[1],[[-1,3]],"unknot with a half-twist (positive crossing)"],
 [[2],[-1],[[-1,-3]],"unknot with a half-twist (negative crossing)"],
 [[2,4],[1,1],[[1,6]],"unknot with two half-twists (positive crossings)"],
 [[4,6,2],[1,1,1],[[1,-7],[-1,-3],[-1,5]],"right-handed trefoil knot, 3_1"],
 [[4,6,2,8],[-1,1,-1,1],[[1,-8],[-1,-4],[1,0],[-1,4],[1,8]],"figure-eight knot, 4_1"],
 [[6,8,10,2,4],[-1,-1,-1,-1,-1],[[-1,-7],[-1,1],[1,5],[-1,9],[1,13]],"pentafoil knot, 5_1"],
 [[6,8,10,4,2],[-1,-1,-1,-1,-1],[[-1,-11],[1,-7],[-2,-3],[1,1],[-1,5],[1,9]],"three-twist knot, 5_2"],
 [[4,8,10,2,12,6],[1,1,-1,1,-1,-1],[[-1,-12],[2,-8],[-2,-4],[3,0],[-2,4],[2,8],[-1,12]],"6_3"],
 [[4,6,2,10,12,8],[-1,-1,-1,-1,-1,-1],[[1,-10],[2,-2],[-2,2],[1,6],[-2,10],[1,14]],"granny knot (sum of two identical trefoils)"],
 [[4,6,2,-10,-12,-8],[1,1,1,1,1,1],[[1,-14],[-2,-10],[1,-6],[-2,-2],[2,2],[1,10]],"square knot (sum of two mirrored trefoils)"],
 [[6,-12,2,8,-4,-10],[-1,-1,-1,1,-1,1],[[1,-2],[1,6],[-1,10]],"example knot"]
]

Tài nguyên bên ngoài

Không cần thiết cho thử thách, nhưng nếu bạn quan tâm:


bài viết hộp cát: 1 , 2

cảm ơn @ChasBrown và @ H.Pwiz vì đã bắt lỗi trong định nghĩa của tôi về ký hiệu Dowker


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Mego

1
@ngn: Tốt hơn nhiều! Tôi đã đoán rằng đó là những gì có nghĩa, nhưng đó là một chút khó khăn để diễn đạt đúng. :)
Chas Brown

Câu trả lời:


10

K (ngn / k) , 196 193 byte

{!N::2*n:#x;{+/d,'x,'d:&:'-2!(|/n)-n:#:'x}(+/1-2*s){j::+,/y;,/(&0|2*x;(-1+#?{x[j]&:x@|j;x}/!N){-(d,x)+x,d:&4}/,1;&0|-2*x)}'(N!{(x,'|1+x;x+/:!2)}'((2*!n),'-1+x|-x)@'0 1=/:x>0)@'/:+~(y<0)=s:!n#2}

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


12

Brain-Flak , 1316 byte

(({})<({()<(({}<>))><>}){(({})[()()]<{([{}]({})<>({}<>))}{}(([({}<>)]<<>({}<>)<>((({})<<>{({}<>)<>}<>>))>)){({}<>)<>}<>{}(({}<{}(({}<{({}<>)<>}>))>))<>{({}<>)<>}>)}<>>){(({}){}()<({}<>)>)<>{}(({}){}<>)<>}<>{}{}(()){(<({}<({}<>)>)>)<>((){[()](<(({})<>){({}[({})]<>({}<>))}{}({}<>({}<{}<>{({}<>)<>}>)[()])<>({}({})[()])(([()]{()(<({}[({})]())>)}{})<{(<{}{}>)}{}><>{()((<({}()[({}<>)])<>>))}{}<{}{}>)((){[()]<({}()<({}<({}<<>({()<({}<>)<>>}<>){({}[()]<(({})<({()<({}<>)<>>})<>>)<>{({}[()]<<>({}<>)>)}{}>)}<>>)<>>)>)((){[()](<{}(({})<<>(({})<(<<>({}<<>({}<(()()){({}[()]<([{}]()<>)<>({}<<>{({}({})<>[({}<>)])}{}{}>){({}<>)<>}<>>)}{}>{})>)>)<>{}{({}<>)<>}<>([({}<>)]<((()))>)(())<>({}<>)<>{}({}[()]){<>({}<<>(()()){({}[()]<({}<<>{({}<>)<>}>){({}[({})]<>({}<>))}{}(({})<<>({}<>)<>([{}])>)>)}{}{}>)<>({}<(({})())>[()]<>)}{}({}<<>{}([{}]()<{({}<>)<>}>){({}({})<>[({}<>)])}{}{}>){({}<>)<>}<>{}{}{}>{})>)>)}{}){(<{}(({})<<>(({}{})<<>(<({}<>)>)<>{}{({}<>)<>}<>>(({}){}){})>)>)}>}{}){(<{}([{}]<({}<<>([{}]()<>)<>({}<<>{({}({})<>[({}<>)])}{}{}>){({}<>)<>}<>>({})({}){})>)>)}{}>)}{}){{}(([{}]){}<>{}{}<<>({}<>{}){([{}]({}()()<{}({}<>)(())<>>))}{}{}{}>{})(())<>{{}({}<>)(())<>}(<>)<>}{}}{}{}<>{}{}({}<{{}({}<>)(())<>}<>{{}{((<(())>))}{}}{}{{}({}<>)(())<>}>)<>{{}({}<(<()>)<>([]){{}({}<>)(())<>([])}{}>)<>{{}({}<>)<>}{}{}({}<>)<>}<>

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

Tôi không hối tiếc điều gì. Đầu vào là một danh sách các cặp phẳng.

# Part 1: extract edges
(({})<

({()<(({}<>))><>}){

(({})[()()]<

{([{}]({})<>({}<>))}{}(([({}<>)]<<>({}<>)<>((({})<<>{({}<>)<>}<>>))>)){({}<>)<>}

<>{}(({}<{}(({}<{({}<>)<>}>))>))<>{({}<>)<>}

>)}

<>>){(({}){}()<({}<>)>)<>{}(({}){}<>)<>}<>

{}{}(())

# Part 2: Compute bracket polynomial
{

  # Move degree/sign to other stack
  (<({}<({}<>)>)>)<>

  # If current shape has crossings:
  ((){[()](<

    # Consider first currently listed edge in set
    # Find the other edge leaving same crossing
    (({})<>){({}[({})]<>({}<>))}{}

    # Move to top of other stack
    # Also check for twist
    ({}<>({}<{}<>{({}<>)<>}>)[()])

    # Check for twist in current edge
    <>({}({})[()])

    (

      # Remove current edge if twist
      ([()]{()(<({}[({})]())>)}{})<{(<{}{}>)}{}>

      # Remove matching edge if twist
      <>{()((<({}()[({}<>)])<>>))}{}<{}{}>

    # Push 1 minus number of twists from current vertex.
    )

    # If number of twists is not 1:
    ((){[()]<

      # While testing whether number of twists is 2:
      ({}()<

        # Keep sign/degree on third stack:
        ({}<({}<

          # Duplicate current configuration
          <>({()<({}<>)<>>}<>){({}[()]<(({})<({()<({}<>)<>>})<>>)<>{({}[()]<<>({}<>)>)}{}>)}

        # Push sign and degree on separate stacks
        <>>)<>>)

      # If number of twists is not 2: (i.e., no twists)
      >)((){[()](<{}

        # Make first copy of sign/degree
        (({})<<>(({})<

          # Make second copy of sign/degree
          (<<>({}<<>({}<

            # Do twice:
            (()()){({}[()]<

              # Prepare search for vertex leading into crossing on other side
              ([{}]()<>)

              # While keeping destination on third stack:
              <>({}<

                # Search for matching edge
                <>{({}({})<>[({}<>)])}{}

              # Replace old destination
              {}>)

              # Move back to original stack
              {({}<>)<>}<>

            >)}{}

          # Add orientation to degree
          >{})>)>)

          # Move duplicate to left stack
          <>{}{({}<>)<>}<>

          # Create "fake" edges from current crossing as termination conditions
          ([({}<>)]<((()))>)(())<>

          # Create representation of "top" new edge
          ({}<>)<>{}({}[()])

          # While didn't reach initial crossing again:
          {

            # Keep destination of new edge on third stack
            <>({}<<>

              # Do twice:
              (()()){({}[()]<

                # Search for crossing
                ({}<<>{({}<>)<>}>){({}[({})]<>({}<>))}{}

                # Reverse orientation of crossing
                (({})<<>({}<>)<>([{}])>)

              >)}{}

              # Remove extraneous search term
              {}

            # Push new destination for edge
            >)

            # Set up next edge
            <>({}<(({})())>[()]<>)

          }

          # Get destination of last edge to link up
          {}({}<

            # Find edge headed toward original crossing
            <>{}([{}]()<{({}<>)<>}>){({}({})<>[({}<>)])}

          # Replace destination
          {}{}>)

          # Move everything to left stack
          {({}<>)<>}

          # Clean up temporary data
          <>{}{}{}

        # Push new sign/degree of negatively smoothed knot
        >{})>)

      # Else (two twists)
      # i.e., crossing is the twist in unknot with one half-twist
      >)}{}){(<{}

        # Copy sign and degree+orientation
        (({})<<>(({}{})<

          # Move sign to left stack
          <>(<({}<>)>)

          # Move copy of configuration to left stack
          <>{}{({}<>)<>}

        # Add an additional 4*orientation to degree
        <>>(({}){}){})>)

      >)}

    # Else (one twist)
    >}{}){(<

      # Invert sign and get degree
      {}([{}]<({}<

        # Search term for other edge leading to this crossing
        <>([{}]()<>)

        # With destination on third stack:
        <>({}<

          # Find matching edge
          <>{({}({})<>[({}<>)])}{}

        # Replace destination
        {}>)

        # Move stuff back to left stack
        {({}<>)<>}<>

      # Add 3*orientation to degree
      >({})({}){})>)

    >)}{}

  # Else (no crossings)
  >)}{}){{}

    # If this came from the 2-twist case, undo splitting.
    # If this came from an initial empty input, use implicit zeros to not join anything
    # New sign = sign - 2 * next entry sign
    (([{}]){}<>{}{}<

      # New degree = average of both degrees
      <>({}<>{})

      # Find coefficient corresponding to degree
      {([{}]({}()()<{}({}<>)(())<>>))}{}{}

    # Add sign to coefficient
    {}>{})

    # Move rest of polynomial back to right stack
    (())<>{{}({}<>)(())<>}

    # Set up next configuration
    (<>)<>

  }{}

}{}{}<>{}

# Step 3: Put polynomial in correct form

# Keeping constant term:
{}({}<

  # Move to other stack to get access to terms of highest absolute degree
  {{}({}<>)(())<>}<>

  # Remove outer zeros
  {{}{((<(())>))}{}}

  # Move back to right stack to get access to lower order terms
  {}{{}({}<>)(())<>}

>)<>

# While terms remain:
{

  # Move term with positive coefficient
  {}({}<(<()>)<>([]){{}({}<>)(())<>([])}{}>)<>{{}({}<>)<>}{}

  # Move term with negative coefficient
  {}({}<>)<>

}<>

Aiaaaaaa. Tuyệt diệu!!!! +1
Don Ngàn

Tôi cảm thấy mình cần phải đưa ra một tiền thưởng khác
Don Nghìn
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.