สถานการณ์ที่ยากลำบาก


35

ให้สัญลักษณ์ของ Dowker เกี่ยวกับปมและเครื่องหมายกากบาทให้คำนวณพหุนามวงเล็บของมัน

แม้ว่าจะมีคำจำกัดความทางเทคนิคมากขึ้น แต่สำหรับความท้าทายนี้ก็เพียงพอที่จะคิดว่าปมเป็นสิ่งที่สร้างขึ้นทางร่างกายโดยการแนบปลายทั้งสองของสายเข้าด้วยกัน เนื่องจากมีปมอยู่ในสามมิติเมื่อเราวาดลงบนกระดาษเราใช้แผนภาพโบว์ - ประมาณการสองมิติซึ่งการข้ามนั้นมีสองบรรทัดอย่างใดอย่างหนึ่งและหนึ่งภายใต้

ป้อนคำอธิบายรูปภาพที่นี่

ที่นี่ (b) และ (c) เป็นไดอะแกรมต่าง ๆ ของปมเดียวกัน

เราจะแสดงแผนภาพปมบนกระดาษได้อย่างไร พวกเราส่วนใหญ่ไม่ใช่แรมแบรนดท์ดังนั้นเราจึงต้องพึ่งพาสัญลักษณ์ของ Dowkerซึ่งทำงานดังนี้:

เลือกจุดเริ่มต้นโดยพลการบนปม ย้ายไปในทิศทางที่พลพร้อมโบว์และหมายเลขข้ามไปที่คุณพบเริ่มต้นจาก 1 กับการปรับเปลี่ยนต่อไปนี้: ถ้ามันเป็นเลขคู่และคุณกำลังจะมากกว่าข้ามปฏิเสธว่าเลขคู่ สุดท้ายเลือกตัวเลขคู่ที่สอดคล้องกับ 1, 3, 5, ฯลฯ

ลองตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

บนปมนี้เราเลือก "1" เป็นจุดเริ่มต้นของเราแล้วเลื่อนขึ้นไปทางขวา ทุกครั้งที่เราไปมากกว่าหรือภายใต้ชิ้นส่วนของเชือกอื่นเรากำหนดจุดข้ามจำนวนธรรมชาติต่อไป เราลบล้างเลขคู่ที่สอดคล้องกับเส้นที่ผ่านการข้ามเช่น[3,-12]ในแผนภาพ [[1,6],[2,5],[3,-12],[-4,9],[7,8],[-10,11]]ดังนั้นแผนภาพนี้จะได้รับการแสดงโดย รายชื่อเพื่อนของ 1, 3, 5, 7, ฯลฯ [6,-12,2,8,-4,-10]จะช่วยให้เรา

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

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

ป้อนคำอธิบายรูปภาพที่นี่

ในการข้ามบวกบรรทัดล่างจะไปทางซ้ายจากมุมมองของบรรทัดบน ในการข้ามเชิงลบมันจะไปทางขวา โปรดทราบว่าการย้อนกลับทิศทางของการไปรอบ ๆ ปม (เช่นการสลับทั้งโอเวอร์เฮดและอันเดอร์ไลน์) ไม่ได้เป็นการเปลี่ยนสัญญาณข้าม [-1,-1,-1,1,-1,1]ในตัวอย่างของเราสัญญาณข้ามเป็น พวกเขาจะได้รับในลำดับเดียวกันกับสัญกรณ์ Dowker เช่นสำหรับ crossings หมายเลข 1, 3, 5, 7 เป็นต้น

ในการท้าทายนี้เราจะคำนวณพหุนามวงเล็บเหลี่ยมของปม มันเป็นวัตถุที่ไม่เปลี่ยนแปลงตลอดการเปลี่ยนแปลงส่วนใหญ่ของแผนภาพปม - แนวคิดที่ทำให้มีประโยชน์อย่างยิ่งในการวิเคราะห์ทฤษฎีปม (อีกครั้งนักทฤษฎีปมส่วนใหญ่คำนวณพหุนามแบบวงเล็บปีกกาเป็นผลิตภัณฑ์ระดับกลางระหว่างทางที่จะคำนวณพหุนาม Jones ซึ่งคงที่ตลอดการแปลง แต่เราจะไม่ทำอย่างนั้น) มันทำงานอย่างไร พหุนามแบบวงเล็บคือพหุนาม Laurent ซึ่งเป็นหนึ่งในตัวแปร (ชื่อดั้งเดิม ) สามารถยกระดับเป็นพลังเชิงลบเช่นเดียวกับในเชิงบวกA

สำหรับปมไดอะแกรมกฎสามข้อของพหุนามแสดงเป็นคือ:D DD

ป้อนคำอธิบายรูปภาพที่นี่

  1. การวนซ้ำที่ไม่มีการข้ามใด ๆ มีพหุนาม 1

  2. ถ้าเรามีแผนภาพประกอบด้วยและห่วงเชื่อมต่อจาก , พหุนามสำหรับทั้งเป็นพหุนามสำหรับครั้ง2})D D ( - A 2 - A - 2 )DDD(A2A2)

  3. กฎนี้มีเล่ห์เหลี่ยมที่สุด มันบอกว่าถ้าคุณมีการข้ามในที่ดูเหมือนคุณสามารถใช้กฎนี้เพื่อทำให้ปมที่ง่ายขึ้นในสองวิธีที่แตกต่างกัน:Dป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ในภาพด้านบนการข้ามที่ระบุไว้ในแผนภาพแรกซึ่งเป็นรูปแบบป้อนคำอธิบายรูปภาพที่นี่สามารถเปลี่ยนป้อนคำอธิบายรูปภาพที่นี่เป็นในรูปที่สอง (หรือการปรับให้เรียบเป็นบวก ) หรือป้อนคำอธิบายรูปภาพที่นี่ในรูปที่สาม (การปรับให้เรียบเป็นลบ )

ดังนั้นพหุนามวงเล็บเหลี่ยมของไดอะแกรมแรกคือพหุนามวงเล็บเหลี่ยมของสองคูณบวกครั้งที่สาม , คือ,A - 1AA1

ป้อนคำอธิบายรูปภาพที่นี่

สับสนหรือยัง ลองทำตัวอย่างพยายามค้นหาพหุนามวงเล็บเหลี่ยมของป้อนคำอธิบายรูปภาพที่นี่(หมายเหตุ: นี่คือสองนอตที่เชื่อมโยงกันแผนภาพชนิดนี้จะไม่เป็นข้อมูลที่มีศักยภาพในการท้าทายนี้เนื่องจากอินพุตจะเป็นนอตเดียว แต่อาจปรากฏเป็น ผลกลางในอัลกอริทึม)

ก่อนอื่นเราใช้กฎ 3

ป้อนคำอธิบายรูปภาพที่นี่

เราใช้กฏ 3 อีกครั้งทั้งสองนอตใหม่

ป้อนคำอธิบายรูปภาพที่นี่

เราเปลี่ยนนอตใหม่ 4 อันนี้เป็นสมการแรก

ป้อนคำอธิบายรูปภาพที่นี่

การใช้กฎ 1 และ 2 กับ 4 เหล่านี้บอกเรา

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นสิ่งนี้บอกเรา

ป้อนคำอธิบายรูปภาพที่นี่

ขอแสดงความยินดีกับการจบบทนำสั้น ๆ ของคุณเกี่ยวกับทฤษฎีปม!

อินพุต

สองรายการ:

  • สัญกรณ์ Dowker [6,-12,2,8,-4,-10]เช่น การกำหนดหมายเลขของการข้ามจะต้องเริ่มต้นจาก 1 หมายเลขคี่ที่สอดคล้องกัน[1,3,5,7,...]นั้นเป็นนัยและจะต้องไม่ให้เป็นอินพุต

  • ป้าย ( 1/ -1หรือถ้าคุณต้องการ0/ 1หรือfalse/ trueหรือ'+'/ '-') เพื่อข้ามที่สอดคล้องกับสัญกรณ์ Dowker [-1,-1,-1,1,-1,1]เช่น

แทนที่จะเป็นรายการคู่คุณอาจมีรายการคู่เช่น [[6,-1],[-12,-1],...

เอาท์พุต

พิมพ์หรือกลับพหุนามเช่นเป็นรายการของคู่ค่าสัมประสิทธิ์-สัญลักษณ์ (หรือคู่สัญลักษณ์-ค่าสัมประสิทธิ์) ในการเพิ่มคำสั่งของเลขยกกำลังและค่าสัมประสิทธิ์โดยไม่ต้องใด ๆ ที่เป็นศูนย์เช่นA2+5+AA3[[1,-2],[5,0],[1,1],[-1,3]]

อีกวิธีหนึ่งคือการส่งออกรายชื่อแปลกที่มีความยาวของสัมประสิทธิ์ correspondings เพื่อเลขชี้กำลังสำหรับบางเช่น องค์ประกอบกลางคือคำคงที่ (ค่าสัมประสิทธิ์ก่อน ) องค์ประกอบซ้ายสุดและขวาสุดต้องไม่เป็นทั้ง 0k N A 0kkkN[0,1,0,5,1,0,-1]A0

กฎระเบียบ

นี่คือความท้าทายไม่สามารถใช้ช่องว่างมาตรฐานและไลบรารีที่มีเครื่องมือในการคำนวณสัญลักษณ์ Dowker หรือชื่อพหุนามแบบ Bracket ไม่สามารถใช้งานได้ (ภาษาที่มีไลบรารีเหล่านี้ยังคงสามารถใช้งานได้ แต่ไม่ใช่ไลบรารี / แพ็คเกจ)

การทดสอบ

// 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"]
]

ทรัพยากรภายนอก

ไม่จำเป็นสำหรับความท้าทาย แต่ถ้าคุณสนใจ:


โพสต์ sandbox: 1 , 2

ขอบคุณ @ChasBrown และ @ H.Pwiz สำหรับความผิดพลาดในคำจำกัดความของ Dowker


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Mego

1
@ngn: ดีกว่ามาก! ฉันเดาว่านั่นเป็นสิ่งที่มีความหมาย แต่มันก็เป็นบิตของลิ้นที่จะแสดงอย่างถูกต้อง :)
Chas Brown

คำตอบ:



12

Brain-Flak , 1316 ไบต์

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

ลองออนไลน์!

ฉันไม่เสียใจอะไรเลย อินพุตคือรายการคู่ที่แบน

# 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
  {}({}<>)<>

}<>

Whoaaaaaa ยอดเยี่ยม !!!! +1
Don Thousand

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