ביטול שגיאות הסתברותי עם חרוטי אור מוצללים
רקע
מדריך זה מדגים כיצד להפחית שגיאות באמצעות תוסף Shaded lightcone (SLC). תוסף זה הוא התפתחות של טכניקת ביטול שגיאות הסתברותי (PEC), שבה משתמש לומד את הרעש של שכבות ייחודיות ב-Circuit ואז מבטל את הרעש על ידי החלת שערי Qubit בודדים וטכניקות עיבוד-לאחר. בהשוואה לשיטות אחרות, PEC מציע גבולות חזקים יותר על ההטיה של התוצאה המצומצמת, אך נוטה לסבול מעומס גבוה יותר מבחינת זמן QPU. במהלך PEC, כדי לפצות על הנחתת ערך ההצפנה על ידי הרעש, התוצאה הממוצעת משוקללת מחדש בגורם , כאשר הוא קצב הרעש הנלמד של שגיאת פאולי בשכבה ב-Circuit. שינוי הגודל הזה מגדיל את השונות בגורם , ולכן גם מכפיל את מספר ביצועי ה-Circuit הנדרשים ב-QPU ב-, שאנחנו מכנים עלות הדגימה או עומס הדגימה. מכיוון ש- גדל בצורה אקספוננציאלית, PEC מוגבל לרוב ל-Circuitים רדודים או עם מעט Qubitים. למד עוד על PEC ב-Probabilistic error cancellation with sparse Pauli-Lindblad models on noisy quantum processors.
אם נוכל לזהות שגיאות שאין צורך לצמצם, נ וכל להפחית את עלות הדגימה הזו בצורה אקספוננציאלית. צעד ראשון בכיוון זה הוא יישום צמצום שגיאות מודע מקומית, המשתמש ב"חרוט אור" קונבנציונלי הניתן לחישוב מהיר כדי להפחית את עומס PEC על ידי הגבלת הרגישות של תוחלת לשגיאות לאורך ה-Circuit, ובכך להרחיב את הישימות של PEC לסדר גודל גדול יותר עבור חלק מהבעיות. שגיאות מחוץ לחרוט האור הזה אינן יכולות להשפיע על התוצאה הנמדדת ולכן ניתן לא לכלול אותן בהליך ביטול השגיאות. הוצאה זו מפחיתה את עומס הדגימה, במקרים מסוימים באופן מהותי, מבלי להכניס הטיה נוספת. בפרט, למדידת תוחלת מקומית של Circuit בעומק קבוע, עומס הדגימה הנדרש בסופו של דבר מתייצב בעת הגדלת מספר ה-Qubitים ב-Circuit (ראה איור 2b ב-Locality and Error Mitigation of Quantum Circuits.)
חרוטי אור מוצללים (SLC) הולכים צעד נוסף, ומשתמשים בסימולציות קלאסיות כדי לקבוע בצורה הדוקה יותר את הרגישות לשגיאות לאורך ה-Circuit. זה מחליף חלק מזמן QPU בזמן CPU ומפחית את עומס הדגימה הנדרש לנרמול ההטיה. במקום חתך חד, לכל שגיאה פוטנציאלית ב-Circuit מוקצה "גוון" מדורג שמגביל מלמעלה את הרגישות של התוחלת לאותה שגיאה. אפיון מעודן זה מאפשר יישומים יעילים וממוקדים יותר של PEC עם שונות מופחתת, תוך מתן למשתמש היכולת לכוונן באופן נשלט את ההטיה באמדן התוחלת. ראה Lightcone shading for classically accelerated quantum error mitigation לפרטים נוספים.
תהליך העבודה שלנו עבור תוסף SLC מנצל את מסגרת Samplomatic ו-Executor החדשה, המאפשרת למשתמשים שליטה מודולרית יותר על הגדרות הביצוע לצמצום ומניעת שגיאות, תוך שמירה על קלות שימוש למשתמשים מתקדמים. להבנה מעמיקה יותר של היתרונות של מסגרת זו ותכונותיה הכלליות, ראה במדריך Hello samplomatic.
תהליך עבודה עבור הצללת חרוט אור, למידת רעש, והזרקת אנטי-רעש
למידול רעש ה-QPU, בחרנו להשתמש במודל רעש Pauli-Lindblad דליל עם קצבי שגיאת פאולי של 1 ו-2 Qubitים, שנוצרים מקומית על כל Qubit וקצה של המכשיר. עם בחירה זו, תהליך עבודה צמצום השגיאות SLC המוצג במדריך זה הוא כדלקמן:
א. CPU — הגבלת ההשפעה לכל שגיאה של שגיאות פאולי של 1 ו-2 Qubitים
- התפשטות קדימה (הגבלת ההשפעה על התוחלת). מפיצים כל שגיאה לסוף ה-Circuit ומחשבים את הקומוטטור שלה עם התוחלת.
- קוצצים איברי אופרטור במהלך האבולוציה כדי לשמור על החישוב אפשרי.
- מהדקים עוד יותר את הגבולות הללו על ידי התפשטות לאחור רופפת של התוחלת המבוססת על גבולות מהירות קוונטיים.
- התפשטות לאחור (הגבלת ההשפעה על המצב ההתחלתי). מפיצים כל שגיאה לתחילת ה-Circuit ומחשבים את הקומוטטור שלה עם המצב ההתחלתי.
ב. QPU — למידת קצבי רעש. משתמשים ב-NoiseLearner כדי לאמוד קצבים של מודל רעש ה-Pauli-Lindblad.
ג. CPU — תעדוף צמצום
- עדכון גבולות ממוזגים עם קצבי רעש נלמדים. משלבים גבולות קדימה ולאחור שחושבו קודם לכן ומעדכנים אותם עם קצבי רעש נלמדים.
- מדרגים רכיבי רעש לצמצום על ידי שימוש בגבולות המחושבים ובקצבים הנלמדים. מתעדפים כל שגיאת רעש אפשרית על פי ההשפעה המשוערת שלה על ההטיה ועל עלות התיקון הנלווית.
ד. QPU — הוספת אנטי-רעש והרצה. מריצים את ה-Circuit המבוקש עם אנטי-רעש (רעש הפוך) המצוין באמצעות הערות Box.
ה. CPU — אמדן התוחלת. מחשבים את ערך הציפיה, תוך החלת סינון לאחר מדידה להפחתת השפעת רעש לא-מרקובי.
סקירת למידת רעש
למידת רעש היא שלב נפוץ במספר שיטות צמצום שגיאות, המבוצעת על ידי NoiseLearner, וניתן לראות אותה במדריך PEA error mitigation שלנו, וכן במדריך Propagated noise absorption (PNA). ב-NoiseLearnerV3, משתמש יכול לזהות באופן ספציפי את שכבות הרעש שיש ללמוד כאובייקטי CircuitInstruction, מה שמאפשר למשתמשים לחשב את גבולות רעש SLC הרצויים לכל שכבה בדרך המתוארת לעיל. מודל Pauli-Lindblad הנלמד מספק מקדמים לשימוש בתעדוף PEC-SLC. האופן שבו השערים נאספים לשכבות ניתן לקביעה באמצעות פונקציות הנוחות generate_boxing_pass_manager ו-unique_2q_instructions, ולאחר מכן מוזנים לפונקציית כלי ה-SLC generate_noise_model_paulis, כמתואר בשלב 2 להלן.
| חלק 1 | חלק 2 | חלק 3 |
|---|---|---|
| סיבוב פאולי של שכבות שערים דו-Qubit | חזרה על זוגות זהות של שכבות ולמידת רעש | גזירת נאמנות (שגיאה לכל ערוץ רעש) |
![]() | ![]() |
סקירת עיבוד לאחר
לאחר ביצוע על חומרת קוונטום באמצעות מסגרת Samplomatic ו-Executor, אנחנו ממירים את מדידות מחרוזת הסיביות לערך התוחלת הרצוי. במקרה של Circuit האיזינג המשוקף שלנו, נקבל באופן אידיאלי תוחלת נמדדת של 1, מכיוון שכל ה-Qubitים אמורים לחזור באופן אידיאלי לנקודת ההתחלה שלהם . בעת חישוב ערך התוחלת עם פונקציית expectation_values שלנו, נחיל מספר טכניקות עיבוד-לאחר המפחיתות את השפעת הרעש. זה כולל הסרת shots שהושפעו מרעש ל א-מרקובי, צמצום שגיאות קריאה, וכן התחשבות בפרטים של יישום PEC שלנו. פרטים נדונים בשלב 4 להלן.
דרישות מוקדמות
לפני שתתחיל מדריך זה, ודא שהחבילות הבאות מותקנות:
- Qiskit IBM Runtime עם פרימיטיב Executor (
pip install "qiskit-ibm-runtime @ git+https://github.com/Qiskit/qiskit-ibm-runtime.git") - Qiskit addon Shaded lightcone 0.1 (
pip install "qiskit-addon-slc~=0.1.0") - Qiskit addon utils (
pip install "qiskit-addon-utils~=0.3.0") - Samplomatic v0.16 ומעלה (
pip install samplomatic) - תמיכה בהדמיה של Qiskit (
pip install "qiskit[visualization]")
שלב 0. הגדרה
ראשית, ייבא את החבילות והפונקציות הנדרשות להרצה מוצלחת של מחברת זו.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-addon-slc qiskit-addon-utils qiskit-ibm-runtime samplomatic
import logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(module)s %(message)s")
# Setting this value prevents itertools.starmap deadlock on UNIX systems
from multiprocessing import set_start_method
set_start_method("spawn")
# Needed to prevent PySCF from parallelizing internally (SLC only)
%set_env OMP_NUM_THREADS=1
env: OMP_NUM_THREADS=1
import pickle
import numpy as np
import samplomatic
from matplotlib import pyplot as plt
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import PassManager, generate_preset_pass_manager
from qiskit_addon_slc.bounds import (
compute_backward_bounds,
compute_forward_bounds,
compute_local_scales,
merge_bounds,
tighten_with_speed_limit,
)
from qiskit_addon_slc.utils import generate_noise_model_paulis, map_modifier_ref_to_ref
from qiskit_addon_slc.visualization import draw_shaded_lightcone
from qiskit_addon_utils.exp_vals.expectation_values import executor_expectation_values
from qiskit_addon_utils.exp_vals.measurement_bases import get_measurement_bases
from qiskit_addon_utils.noise_management import gamma_from_noisy_boxes, trex_factors
from qiskit_addon_utils.noise_management.post_selection import PostSelector
from qiskit_addon_utils.noise_management.post_selection.transpiler.passes import (
AddPostSelectionMeasures,
AddSpectatorMeasures,
)
from qiskit_ibm_runtime import Executor, QiskitRuntimeService, QuantumProgram
from qiskit_ibm_runtime.noise_learner_v3 import NoiseLearnerV3
from qiskit_ibm_runtime.options import NoiseLearnerV3Options
from samplomatic.transpiler import generate_boxing_pass_manager
from samplomatic.utils import find_unique_box_instructions
שלב 1. מיפוי הבעיה
לנוחות ההדגמה, אנחנו בוחרים שרשרת איזינג מראה חד-מימדית. שרשרת האיזינג החד-מימדית מספקת מבנה Circuit צפוף בצורה נחמדה, שנוח להצגת יישומי PEC. Circuit מראה מקל על ידיעת התוצאה הצפויה (כלומר, עלינו למדוד תוחלת של 1).
יתר על כן, אנחנו רוצים להריץ Circuit מראה, כך שעבור כל שער בחצי השני של ה-Circuit, יצטרך להיות שער הפוך בחצי הראשון. מכיוון שלתוחלת הנמדדת יש מדידות שאינן בבסיס Z, וה-Executor מתחשב בבסיס הרצוי בסוף ה-Circuit, אנחנו מספקים פונקציית prepare_basis שמוסיפה את השערים המתאימים בתחילת Circuit המראה. פרט זה ספציפי להדגמת ה-Circuit המשוקף שלנו. הפונקציה get_measurement_bases מאפשרת לנו לזהות בקלות אילו שערים נדרשים ואיפה לצרף אותם, וכן לעקוב אחר עדינויות אינדקס ה-Qubit הנובעות מאמנות בהערת box כנדון בסעיף "הכן מדידות בסיסים קנוניים".
num_qubits = 20
target_obs_sparse = [("XZ", [6, 13], 1.0)]
observable = SparsePauliOp.from_sparse_list(target_obs_sparse, num_qubits=num_qubits)
bases_virt, reverser_virt = get_measurement_bases(observable)
num_trotter_steps = 10
rx_angle = np.pi / 4
def construct_ising_circuit(
num_qubits: int, num_trotter_steps: int, rx_angle: float, barrier: bool = True
) -> QuantumCircuit:
circuit = QuantumCircuit(num_qubits)
for _step in range(num_trotter_steps):
circuit.rx(rx_angle, range(num_qubits))
if barrier:
circuit.barrier()
for first_qubit in (1, 2):
for idx in range(first_qubit, num_qubits, 2):
# equivalent to Rzz(-pi/2):
circuit.sdg([idx - 1, idx])
circuit.cz(idx - 1, idx)
if barrier:
circuit.barrier()
return circuit
def prepare_basis(circuit: QuantumCircuit, basis: list[int]) -> QuantumCircuit:
# basis is a list of integer values from 0 to 3. These map to the basis measurement as:
# 0 = I; 1 = Z; 2 = X; 3 = Y
assert len(basis) == circuit.num_qubits
out_circ = circuit.copy_empty_like()
for qb, bas in enumerate(basis):
if bas in {0, 1}:
continue
if bas == 2:
out_circ.h(qb)
elif bas == 3:
out_circ.rx(-np.pi / 2, qb)
out_circ.barrier()
out_circ.compose(circuit, inplace=True)
return out_circ
def mirror_circuit(circuit: QuantumCircuit, *, inverse_first: bool = False) -> QuantumCircuit:
mirror_circ = circuit.copy_empty_like()
mirror_circ.compose(circuit.inverse() if inverse_first else circuit, inplace=True)
mirror_circ.barrier()
mirror_circ.compose(circuit if inverse_first else circuit.inverse(), inplace=True)
mirror_circ.measure_active()
return mirror_circ
# Instantiate circuit
circuit = construct_ising_circuit(num_qubits, num_trotter_steps, rx_angle, barrier=False)
mirrored_circuit = mirror_circuit(circuit, inverse_first=True)
mirrored_circuit = prepare_basis(mirrored_circuit, bases_virt[0])
mirrored_circuit.draw("mpl", fold=-1, scale=0.3, idle_wires=False, measure_arrows=False)

שלב 2. אופטימיזציה
נבצע אופטימיזציה של פרטים הקשורים ל-Circuit שיורץ, לאובזרבל שיימדד ולפרמטרים של לימוד הרעש. כנקודת פתיחה, נוודא שאנחנו יוצרים מופע של Backend עם תמיכה ב-fractional gates. שערים אלה יאפשרו רגישות גבוהה יותר בחלק מסינוני ה-post-selection שלנו.
token = "<YOUR_TOKEN>"
instance = "<YOUR_INSTANCE>"
# This is used to retrieve shared results
shared_service = QiskitRuntimeService(
channel="ibm_quantum_platform",
token=token,
instance=instance,
)
# This is used to run on real hardware
service = service = QiskitRuntimeService()
qiskit_runtime_service._discover_account:WARNING:2025-11-10 11:19:40,108: Loading account with the given token. A saved account will not be used.
backend = service.backend("ibm_kingston", use_fractional_gates=True)
ראשית, נבצע transpile ל-Circuit שלנו להוראות ISA, כנדרש להרצה על ה-QPUs שלנו. עבור הנתונים שנאספו בניסוי זה, בחרנו ידנית את ה-Qubits שלנו בהתבסס על הערכה של שרשרת האיכות הגבוהה ביותר.
layout = [44, 45, 46, 47, 57, 67, 68, 69, 78, 89, 88, 87, 97, 107, 106, 105, 104, 103, 96, 83]
isa_pm = generate_preset_pass_manager(backend=backend, initial_layout=layout, optimization_level=0)
isa_circuit = isa_pm.run(mirrored_circuit)
assert isa_circuit.layout.final_index_layout() == layout
isa_observable = observable.apply_layout(layout, num_qubits=isa_circuit.num_qubits)
2025-11-10 11:19:57,810 INFO base_tasks Pass: ContainsInstruction - 0.00715 (ms)
2025-11-10 11:19:57,811 INFO base_tasks Pass: UnitarySynthesis - 0.00525 (ms)
2025-11-10 11:19:57,811 INFO base_tasks Pass: HighLevelSynthesis - 0.02599 (ms)
2025-11-10 11:19:57,811 INFO base_tasks Pass: BasisTranslator - 0.09131 (ms)
2025-11-10 11:19:57,811 INFO base_tasks Pass: SetLayout - 0.02623 (ms)
2025-11-10 11:19:57,812 INFO base_tasks Pass: FullAncillaAllocation - 0.14400 (ms)
2025-11-10 11:19:57,812 INFO base_tasks Pass: EnlargeWithAncilla - 0.06318 (ms)
2025-11-10 11:19:57,813 INFO base_tasks Pass: ApplyLayout - 0.29802 (ms)
2025-11-10 11:19:57,813 INFO base_tasks Pass: CheckMap - 0.07820 (ms)
2025-11-10 11:19:57,814 INFO base_tasks Pass: FilterOpNodes - 0.33283 (ms)
2025-11-10 11:19:57,814 INFO base_tasks Pass: UnitarySynthesis - 0.00691 (ms)
2025-11-10 11:19:57,814 INFO base_tasks Pass: HighLevelSynthesis - 0.13208 (ms)
2025-11-10 11:19:57,816 INFO base_tasks Pass: BasisTranslator - 1.00303 (ms)
2025-11-10 11:19:57,818 INFO base_tasks Pass: FoldRzzAngle - 1.78719 (ms)
2025-11-10 11:19:57,818 INFO base_tasks Pass: ContainsInstruction - 0.00691 (ms)
2025-11-10 11:19:57,818 INFO base_tasks Pass: InstructionDurationCheck - 0.00405 (ms)
wire_order = layout + [q for q in range(isa_circuit.num_qubits) if q not in layout]
isa_circuit.draw(
"mpl", fold=-1, scale=0.3, idle_wires=False, wire_order=wire_order, measure_arrows=False
)

הכנסה לתיבות (Box) של ה-Circuit
לנוחות המימוש, נשתמש בפאס הטרנספיילציה generate_boxing_pass_manager, שממקם את הוראות ה-Circuit בתיבות עם הערות. תיבות אלה מצביעות בבירור היכן, במקרה של PEC, יש להזריק antinoise לתוך ה-Circuit. לפרטים על ההגדרות, ראו את תיעוד Samplomatic.
שימו לב שתהליך העבודה של SLC דורש שימוש ב-inject_noise_strategy="individual_modification" בשלב מאוחר יותר, כיוון שהדבר מאפשר לנו לזהות כל BoxOp ב-Circuit באופן ייחודי.
הפונקציה find_unique_box_instructions עוברת על ה-Circuit עם התיבות שסופק ומזהה את אלה שיש להם שכבות 2Q ייחודיות או מדידות, לצורך לימוד רעש והזרקת רעש.
# Box circuit with Twirl and InjectNoise annotations
boxes_pm = generate_boxing_pass_manager(
twirling_strategy="active",
inject_noise_strategy="individual_modification",
inject_noise_targets="gates",
measure_annotations="all",
)
boxed_circuit = boxes_pm.run(isa_circuit)
# Find the unique instructions (layers) from boxed circuit
unique_2q_instructions = find_unique_box_instructions(
boxed_circuit, normalize_annotations=None, undress_boxes=True
)
2025-11-10 11:20:01,088 INFO base_tasks Pass: RemoveBarriers - 0.02289 (ms)
2025-11-10 11:20:01,100 INFO base_tasks Pass: GroupGatesIntoBoxes - 12.38990 (ms)
2025-11-10 11:20:01,101 INFO base_tasks Pass: GroupMeasIntoBoxes - 0.47898 (ms)
2025-11-10 11:20:01,104 INFO base_tasks Pass: AddTerminalRightDressedBoxes - 2.88177 (ms)
2025-11-10 11:20:01,111 INFO base_tasks Pass: AddInjectNoise - 6.66904 (ms)
boxed_circuit.draw(
"mpl", fold=-1, scale=0.3, idle_wires=False, wire_order=wire_order, measure_arrows=False
)

הכנת מדידות בסיס קנוני
בשל הדרך שבה ה-Qubits מתויגים בזיהוי שכבות 2Q ייחודיות, יש לשים לב במיוחד לסדר ה-Qubits. להלן אנחנו מציגים את המושג canonical_qubits כאמצעי לעדכון מתאים של סדר ה-Qubits כשמוסרים אותו ל-executor, כתוצאה מהאופן שבו מסדר ה-Qubit נלכד בזמן הכנסה לתיבות ומציאת הוראות ייחודיות. ראו את תיעוד מוסכמת סדר Qubit לפרטים.
# Determine the canonical qubits order
meas_box = boxed_circuit.data[-1]
canonical_qubits = [
idx for idx, qubit in enumerate(boxed_circuit.qubits) if qubit in meas_box.qubits
]
# map canonical qubit to physical (isa) qubit
c_2_p = {c: p for c, p in enumerate(canonical_qubits)}
# map physical (isa) qubit to virtual qubit (index in original circuit)
p_2_v = {p: v for v, p in enumerate(layout)}
# compute map between virtual and canonical qubit indices.
c_2_v = {c: p_2_v[p] for c, p in c_2_p.items()}
assert len(c_2_v) == num_qubits
bases_canon = [
np.array([base_i[c_2_v[c]] for c in range(num_qubits)], dtype=np.uint8) for base_i in bases_virt
]
תהליך העבודה לצלילת lightcone, לימוד רעש והזרקת anti-noise
הערה: למימוש SLC-PEC בהדרכה זו, אנחנו מריצים חישובי גבולות SLC לפני שלימוד הרעש הושלם, כך שה-Circuit שיש למתן מורץ קרוב בזמן ככל האפשר למודל הרעש הנלמד. מבחינה עקרונית, תהליך עבודה זה ניתן לשיפור נוסף על-ידי הרצה בו-זמנית. כלומר, עבודת לימוד רעש מורצת בזמן שבמקביל מוערכים גבולות הרעש. עבור Circuit קוונטי שרירותי, חישוב גבול הרעש עלול לדרג בתלות מעריכית חלשה. לכן, ייתכן שכדאי להשתמש בהרצה מקבילה כדי למקסם את יעילות תהליך העבודה. לשם כך, אנחנו מדגימים בקצרה זאת על-ידי הכללת משאבי אשכול (128 חוטים) והצגה כיצד ניתן להשיג מערכת גבולות מעודנת יותר עבור Circuit נתון כשמוגבלים לאותה כמות זמן חישוב כמו המחשב הנייד שלנו (8 חוטים). יתרה מזאת, אף שאינו מיושם בתהליך עבודה זה, ניתן להקביל את הרצות ה-QPU ללימוד רעש ולחישובי גבולות רעש כדי להשיג את תהליך העבודה היעיל ביותר.
חיזוי פאולי-מודל הרעש שיילמד
הפונקציה generate_noise_model_paulis עוברת על כל שכבה עם תיבות של ה-Circuit שסופק ומייצרת את כל איברי ה-Pauli הרלוונטיים ממשקל אחד ושניים, תוך התחשבות בקישוריות ה-Qubit של ה-Circuit, ובחירת איברים הרלוונטיים לצמתים ולקשתות הפעילים. איברים אלה משמשים לאחר מכן לחישוב גבולות רעש קדמיים ואחוריים.
noise_model_paulis = generate_noise_model_paulis(
unique_2q_instructions, backend.coupling_map, boxed_circuit
)
noise_model_rates = {ref: None for ref in noise_model_paulis}
א. חישוב והידוק גבולות קדמיים
הפונקציה compute_forward_bounds מעריכה את יחסי ה-commutation בין ה-Gates בכל שכבה ואיברי ה-Pauli שנוצרו לעיל, מבחינת האופן שבו שגיאות בהפצה קדמית משפיעות על האובזרבל הרצוי . עבור Gates שמתחלפות עם איברי ה-Pauli, לא נעשה דבר. עבור Gates מסוג Clifford, הן נדחפות לכיוון תחילת ה-Circuit. עבור Gates שאינן Clifford, אנחנו מקרבים את השפעתן על האובזרבלים המטרה כדי לתת להם עדיפות לביטול רעש בהמשך (אחרי שכל הגבולות מוזגו). גבול זה מושג תחילה על-ידי החלת נורמת L2 (כלומר, שורש ריבועי של סכום הריבועים של מקדמי איברי ה-Pauli הרלוונטיים). כשיש יותר מדי איברי Qubit מעורבים, אנחנו חוזרים לגבול רופף יותר המשתמש באי-שוויון המשולש.

