Bir Düğümlü durum


35

Dowker'ın bir düğüm notasyonu ve geçiş işaretleri dikkate alındığında, parantez polinomunu hesaplayın.

Daha fazla teknik tanım olmasına rağmen, bu zorluk için bir düğümün iki ucunu birbirine bağlayarak fiziksel olarak yapılmış bir düğüm gibi düşünmek yeterlidir . Düğümler üç boyutta bulunduğundan, onları kağıt üzerine çizdiğimizde, düğüm diyagramlarını kullanırız - geçişlerin tam olarak iki çizgiden oluştuğu, biri üst üste iki çizgiden oluşan iki boyutlu çıkıntılar.

görüntü tanımını buraya girin

Burada (b) ve (c) aynı düğümün farklı diyagramlarıdır.

Kağıt üzerinde bir düğüm şemasını nasıl temsil ederiz? Çoğumuz Rembrandt değiliz, bu nedenle aşağıdaki gibi çalışan Dowker notasyonuna güveniyoruz :

Düğümden isteğe bağlı bir başlangıç ​​noktası seçin. Düğüm boyunca isteğe bağlı bir yöne doğru hareket edin ve karşılaştığınız geçişleri 1'den başlayarak, aşağıdaki değişikliklerle numaralandırın: eğer bir çift sayıysa ve şu andaki geçişin üzerinden geçiyorsanız, o sayıyı ihmal edin. Son olarak, 1, 3, 5, vs.'ye karşılık gelen çift sayıları seçin.

Bir örnek deneyelim:

görüntü tanımını buraya girin

Bu düğümde başlangıç ​​noktamız olarak "1" i seçtik ve yukarı ve sağa doğru ilerlemeye devam ettik. Ne zaman ipin bir başka parçasının üzerine ya da altına girersek, geçiş noktasını bir sonraki doğal sayıya atarız. Örneğin [3,-12]şemada , bir geçişin üzerinden geçen tellere karşılık gelen çift sayıları ihmal ediyoruz . Yani, bu şema ile temsil edilecektir [[1,6],[2,5],[3,-12],[-4,9],[7,8],[-10,11]]. 1, 3, 5, 7 vb [6,-12,2,8,-4,-10]. Arkadaşların listelenmesi bize verir .

Burada dikkat edilmesi gereken birkaç şey var. İlk olarak, Dowker notasyonu, belirli bir başlangıç ​​noktası ve yönü seçebileceğimiz için belirli bir düğüm için benzersiz değildir . Ancak, not verildiğinde, düğümün yapısı tam olarak belirlenebilir (teknik olarak birinci düğüm bileşenlerinin yansıması kadar). Tüm Dowker notasyonları olası düğümleri oluşturamasa da, bu problemde girişin gerçek bir düğümü temsil ettiğini varsayabilirsiniz.

Bir düğümün yansımaları arasındaki belirsizliği önlemek ve zorluğu çözmeyi kolaylaştırmak için, size giriş olarak geçiş işaretlerinin bir listesi de verilecektir .

görüntü tanımını buraya girin

Olumlu bir geçişte, alt çizgi üst çizginin bakış açısından sola gider. Negatif bir geçişte sağa gider. Not (yani hem ters düğüm dolaşma yönünü tersine aşırı hattı ve altında geçit işaretleri değişmez line). Örneğimizde, geçiş işaretleri vardır [-1,-1,-1,1,-1,1]. Dowker notasyonu ile aynı sırada verilirler, yani 1, 3, 5, 7, vb. Numaralı geçişler için.

A

DD

görüntü tanımını buraya girin

  1. Herhangi bir geçişi olmayan bir tek döngü polinomu 1 vardır.

  2. DDD(A2A2)

  3. Dgörüntü tanımını buraya girin

görüntü tanımını buraya girin

Yukarıdaki resimde, formunun ilk diyagramda, belirtilen geçiş görüntü tanımını buraya girin, transforme edilebilir görüntü tanımını buraya girin, ikinci şekil (aka gibi pozitif yumuşatma ) ya da görüntü tanımını buraya girinüçüncü bir şekil (olduğu gibi olumsuz bir yumuşatma ).

AA1

görüntü tanımını buraya girin

Aklınız mı karıştı? Bir örnek yapalım, parantez polinomunu bulmaya çalışalım görüntü tanımını buraya girin(Not: bu birbirine bağlanmış iki düğümdür. Bu tür bir diyagram bu zorlamada potansiyel bir girdi olmayacaktır, çünkü girdiler sadece tek düğümler olacaktır, ancak bir algoritmada ara sonuç.)

İlk önce kural 3'ü kullanıyoruz.

görüntü tanımını buraya girin

Her iki düğümde de 3. kuralı tekrar kullanıyoruz.

görüntü tanımını buraya girin

Bu 4 yeni düğümü birinci denklemin yerine koyarız.

görüntü tanımını buraya girin

Bu 4'e 1 ve 2 numaralı kuralların uygulanması bize

görüntü tanımını buraya girin

Demek bu bize

görüntü tanımını buraya girin

Düğüm teorisi için kısa tanıtımınızı tamamladığınız için tebrikler!

Giriş

İki liste:

  • Dowker notasyonu, örn [6,-12,2,8,-4,-10]. Geçişleri numaralandırma karşılık gelen tek sayılar 1. başlamalıdır [1,3,5,7,...]kapalı ve gereken olmayan giriş olarak sağlanabilir.

  • Dowker notasyonuna karşılık gelen geçişler için işaretler ( 1/ -1veya eğer tercih ederseniz 0/ 1veya false/ trueveya '+'/ '-'), örn [-1,-1,-1,1,-1,1].

Bir çift liste yerine, örneğin bir çift listesine sahip olabilirsiniz. [[6,-1],[-12,-1],...

Çıktı

A2+5+AA3[[1,-2],[5,0],[1,1],[-1,3]]

kkkN[0,1,0,5,1,0,-1]A0

kurallar

Bu bir mücadelesi. Standart boşlukların hiçbiri kullanılamaz ve Dowker notasyonlarını veya Bracket polinomlarını hesaplamak için araçlara sahip kütüphaneler kullanılamaz. (Bu kütüphaneleri içeren bir dil, kütüphaneleri / paketleri değil hala kullanılabilir).

Testler

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

Dış kaynaklar

Meydan okuma için gerekli değil, ancak ilgileniyorsanız:


sanal alan gönderileri: 1 , 2

Dowker notasyonu tanımımda bir hata yakaladığı için @ChasBrown ve @ H.Pwiz teşekkürler


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Mego

1
@ ngn: Çok daha iyi! Bunun ne anlama geldiğini tahmin ediyordum, ama düzgün ifade etmek için biraz dil bitti. :)
Chas Brown

Yanıtlar:


10

K (ngn / k) , 196 193 bayt

{!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}

Çevrimiçi deneyin!


12

Brain-Flak , 1316 bayt

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

Çevrimiçi deneyin!

Hiçbir şey için pişman değilim. Giriş, düzleştirilmiş bir çift listesidir.

# 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. Fantastik!!!! +1
Don Bin

Başka bir ödül vermek zorunda olduğumu hissediyorum
Don Thousand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.