TernaryTree
class TernaryTree(spec)
베이스: object
페르미온-큐비트 인코딩을 정의하는 3진 트리.
노드로 구성된 3진 트리는 페르미온 모드를 큐비트로 인코딩한다. 각 노드는 세 개의 하향 링크 ( X, Y 및 로 표시됨)를 가진 큐비트입니다 Z. 링크는 자식 노드로 이어지거나( 가장자리 ) 끝나는 경우( 다리 )가 있습니다. 루트로 향하는 각 가지의 상승 경로는 파울리 문자열을 나타냅니다. 노드 * 에서* 하향하는 로 표시된 연결을 통과하면 큐비트 에 가 기여하고, 그 외 모든 곳에서는 항등 연산이 적용됩니다.
이 모양의 모든 트리는 유효한 인코딩을 생성하므로, 생성자는 임의의 트리를 인수로 받아들입니다. 익숙한 인코딩은 특정한 모양들입니다:
인코딩 | 건설 | 파울리 가중치 |
|---|---|---|
| 조던-위그너 | TernaryTree.chain(n, "Z") | |
| 패리티 | TernaryTree.chain(n, "X") | |
| 균형 잡힌 [1] | TernaryTree.breadth_first(n, 3) | , 최적 |
| 이진 분기 | TernaryTree.breadth_first(n, 2, "ZXY") |
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 이는 모든 페르미온-큐비트 매핑에 대해 파울리 가중치 가 최적이 되는 균형 트리를 제공한다.
branching=2 이는 가중치 를 갖는 이진 분기 트리를 나타낸다. 이는 브라비-키타예프 가중치와 일치하지만, 어떤 값에 대해서도 해당 인코딩은 *아니다 *order. 브라비-키타예프의 트리는 불규칙한 부분합 형태이기 때문이다. 구축 방법은 매퍼 가이드를 참조하세요.
매개변수
- num_nodes – 모드의 수, 즉 큐비트의 수.
- 분기 – 노드당 연결할 자식 노드의 수(1~3개).
- 순서 – 자식을 연결할 레이블을 3자 문자열로 지정합니다. 이를 변경하면 인코딩이 생성하는 파울리 스트링이 달라지지만, 각 스트링의 가중치는 변하지 않습니다.
인상
- ValueError – 가
num_nodes0이거나,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() 를 사용하세요.