Skip to main content
IBM Quantum Platform

TernaryTree

class TernaryTree(spec)

베이스: object

페르미온-큐비트 인코딩을 정의하는 3진 트리.

NN 노드로 구성된 3진 트리는 NN 페르미온 모드를 NN 큐비트로 인코딩한다. 각 노드는 세 개의 하향 링크 ( X, Y 및 로 표시됨)를 가진 큐비트입니다 Z. 링크는 자식 노드로 이어지거나( 가장자리 ) 끝나는 경우( 다리 )가 있습니다. 루트로 향하는 각 가지의 상승 경로는 파울리 문자열을 나타냅니다. 노드 uu* 에서* 하향하는 PP 로 표시된 연결을 통과하면 큐비트 uu 에 PP 가 기여하고, 그 외 모든 곳에서는 항등 연산이 적용됩니다.

이 모양의 모든 트리는 유효한 인코딩을 생성하므로, 생성자는 임의의 트리를 인수로 받아들입니다. 익숙한 인코딩은 특정한 모양들입니다:

인코딩
건설
파울리 가중치
조던-위그너TernaryTree.chain(n, "Z")nn
패리티TernaryTree.chain(n, "X")nn
균형 잡힌 [1]TernaryTree.breadth_first(n, 3)⌈log⁡3(2n+1)⌉\lceil \log_3(2n+1) \rceil, 최적
이진 분기TernaryTree.breadth_first(n, 2, "ZXY")⌊log⁡2n⌋+1\lfloor \log_2 n \rfloor + 1

TernaryTree.chain() 그리고 오직 균일한 가족들만을 TernaryTree.breadth_first() 다루기 때문에, 생성자 역시 임의의 트리를 인수로 받습니다. 즉, 노드당 하나의 항목으로 구성된 ‘부모-라벨’ 사양으로, 해당 노드의 부모와 그 노드로 내려가는 링크의 라벨을 지정합니다(None 루트의 경우). 이 프레임워크의 기반이 되는 트리에는 분재 알고리즘이 필요합니다. 이 알고리즘은 장치의 결합 그래프에 대한 스패닝 트리를 [2] 생성하므로, 그 분기 구조는 해당 연결성을 따르며, 체인 형태도 아니고 균일하지도 않습니다.

이 계열에 속하는 모든 인코딩에 편의 생성자가 있는 것은 아닙니다. 예를 들어, Bravyi-Kitaev는 균일하지 않은 트리이므로, 그 사양을 계산하여 구축됩니다. ‘매퍼 가이드 ’에서는 이 사례를 예시로 다루고 있습니다.


사용량

>>> from qiskit_fermions.mappers import TernaryTree
>>> tree = TernaryTree.breadth_first(4, 3)
>>> tree.num_nodes, tree.num_legs, tree.max_weight
(4, 9, 2)

균형 트리의 무게는 로그 함수적으로 증가하는 반면, 조던-위그너 트리의 무게는 선형적으로 증가합니다:

>>> TernaryTree.chain(13, "Z").max_weight
13
>>> TernaryTree.breadth_first(13, 3).max_weight
3

임의의 트리가 노드당 한 (parent, label) 쌍씩 주어지며, 루트 노드에 대해서는 None 다음과 같습니다:

>>> tree = TernaryTree([None, (0, "X"), (0, "Y"), (1, "Z")])
>>> tree.num_nodes, tree.num_legs
(4, 9)

두 트리는 생성 방식에 관계없이 모양, 레이블 및 노드 번호가 동일할 때 서로 일치한다고 볼 수 있으며, 바로 이 점 덕분에 집합이나 사전은 트리 검색이 산출한 후보들 중에서 중복을 제거할 수 있습니다. 예를 들어, 체인은 분기 수가 1인 TernaryTree.breadth_first() 구조일 뿐이며, 그 중 오직 첫 번째 레이블만이 중요합니다 order :

>>> chain = TernaryTree.chain(3, "Z")
>>> chain == TernaryTree.breadth_first(3, 1, "ZXY")
True
>>> chain == TernaryTree.breadth_first(3, 1, "ZYX")
True
>>> len({chain, TernaryTree.breadth_first(3, 1, "ZXY"), TernaryTree.chain(3, "X")})
2

트리란 검색의 결과이자 인코딩을 정의하는 것이므로, 프로세스 간에 전달할 가치가 있는 대상이며, 피클로 저장할 수 있습니다:

>>> import pickle
>>> tree = TernaryTree.breadth_first(4, 3)
>>> pickle.loads(pickle.dumps(tree)) == tree
True

[ 1 ]

Z. Jiang, A. Kalev, W. Mruczkiewicz 및 H. Neven, “3진 트리를 이용한 최적의 페르미온-큐비트 매핑 및 축소 양자 상태 학습에의 적용”, Quantum 4, 276 (2020), arXiv:1910.10746.

[ 2 ]

A. Miller, Z., Zimborás, S., Knecht, S., Maniscalco, S. 및 G. García-Pérez, “분재 알고리즘: 페르미온-큐비트 매핑을 직접 생성하기”, PRX Quantum 4, 030314 (2023), arXiv:2212.09731.


속성

max_weight

이 트리가 생성하는 모든 단일 마요라나 연산자 중 가장 큰 파울리 가중치.

이 연산자는 두 마요라나 연산자의 합이므로, 페르미온 생성 또는 소멸 연산자의 파울리 항 중 이보다 무거운 것은 없습니다. 하지만 이 두 연산자는 일반적으로 서로 다른 큐비트에 작용하므로, 연산자 전체는 더 많은 큐비트에서 구현될 수 있습니다.

num_legs

다리의 개수는 항상 2 * num_nodes + 1.

이는 모든 모양에 해당됩니다. 자식 노드가 적은 노드는 다리가 더 많고, 줄이 더 적은 것이 아닙니다. 이 중 일부는 마요라나 연산자로 2 * num_nodes 짝을 이루고, 나머지 하나는 전체 페르미온 파리티를 지니게 된다.

num_nodes

노드 수는 모드 수이자 큐비트 수이기도 합니다.

root

루트 노드입니다.


메소드

breadth_first

static breadth_first(num_nodes, branching, order='XYZ')

각 노드에 최대 개의 자식 branching 노드를 차례로 연결하여 트리를 구성하십시오.

branching=3 이는 모든 페르미온-큐비트 매핑에 대해 파울리 가중치 ⌈log⁡3(2n+1)⌉\lceil \log_3(2n+1) \rceil 가 최적이 되는 균형 트리를 제공한다.

참고

branching=2 이는 가중치 ⌊log⁡2n⌋+1\lfloor \log_2 n \rfloor + 1 를 갖는 이진 분기 트리를 나타낸다. 이는 브라비-키타예프 가중치와 일치하지만, 어떤 값에 대해서도 해당 인코딩은 *아니다 *order. 브라비-키타예프의 트리는 불규칙한 부분합 형태이기 때문이다. 구축 방법은 매퍼 가이드를 참조하세요.

매개변수

  • num_nodes – 모드의 수, 즉 큐비트의 수.
  • 분기 – 노드당 연결할 자식 노드의 수(1~3개).
  • 순서 – 자식을 연결할 레이블을 3자 문자열로 지정합니다. 이를 변경하면 인코딩이 생성하는 파울리 스트링이 달라지지만, 각 스트링의 가중치는 변하지 않습니다.

인상

  • ValueError – 가 num_nodes 0이거나, branching 가 1과 3 사이가 아니거나, 파울리 라벨이 3개가 order 아니거나, 또는 처음 개의 branching 라벨이 서로 다를 때 발생합니다.
  • OverflowError – 가 num_nodes 음수이거나 32비트에 들어가지 않는 경우.

chain

static chain(num_nodes, label)

를 따라 아래로 내려가는 선형 사슬을 만들어 보세요 label.

label="Z" 는 조던-위그너 인코딩이고, label="X" 는 패리티 인코딩이며, 둘 다 파울리 가중치가 이다 num_nodes.

이는 단지 편의상 그렇게 한 것일 뿐입니다. 즉, breadth_first() 와 같으며 branching=1, 여기서 에는 딱 하나의 레이블만 order 필요합니다.

매개변수

  • num_nodes – 모드의 수, 즉 큐비트의 수.
  • 라벨 – 사슬이 따라 내려가는 연결고리.

인상

  • ValueError – num_nodes 가 0이거나 label 가 파울리 레이블이 아닌 경우.
  • OverflowError – 가 num_nodes 음수이거나 32비트에 들어가지 않는 경우.

children

children(node)

의 자식 노드들을 node, 그 에지에 대한 {label: child} 매핑으로 반환합니다.

다리로 끝나는 링크는 생략됩니다.

>>> from qiskit_fermions.mappers import TernaryTree
>>> TernaryTree.breadth_first(4, 3).children(0)
{'X': 1, 'Y': 2, 'Z': 3}

인상

ValueError – 가 node 허용 범위를 벗어난 경우.

leg_paths

leg_paths()

각 레그의 파울리 문자열을, 잎에서 뿌리 순서로 정렬된 쌍 (qubit, label) 단위로 반환하십시오.

>>> from qiskit_fermions.mappers import TernaryTree
>>> TernaryTree.chain(2, "Z").leg_paths()
[[(0, 'X')], [(0, 'Y')], [(1, 'X'), (0, 'Z')], [(1, 'Y'), (0, 'Z')], [(1, 'Z'), (0, 'Z')]]

경로 내의 큐비트는 정렬되어 있지 않습니다. 노드 번호 순서가 아닌 트리의 깊이 순서를 따릅니다. 매핑된 관측 가능한 객체가 사용하는 정렬된 형식을 보려면 TernaryTreeEncoding.majorana_image() 를 사용하세요.

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.