initial commit
This commit is contained in:
parent
6f908454fa
commit
4c028e74e2
15 changed files with 3110 additions and 0 deletions
334
.gitignore
vendored
Normal file
334
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,334 @@
|
||||||
|
## Core latex/pdflatex auxiliary files:
|
||||||
|
*.aux
|
||||||
|
*.lof
|
||||||
|
*.log
|
||||||
|
*.lot
|
||||||
|
*.fls
|
||||||
|
*.out
|
||||||
|
*.toc
|
||||||
|
*.fmt
|
||||||
|
*.fot
|
||||||
|
*.cb
|
||||||
|
*.cb2
|
||||||
|
.*.lb
|
||||||
|
|
||||||
|
## Intermediate documents:
|
||||||
|
*.dvi
|
||||||
|
*.xdv
|
||||||
|
*-converted-to.*
|
||||||
|
# these rules might exclude image files for figures etc.
|
||||||
|
# *.ps
|
||||||
|
# *.eps
|
||||||
|
# *.pdf
|
||||||
|
|
||||||
|
## Generated if empty string is given at "Please type another file name for output:"
|
||||||
|
.pdf
|
||||||
|
|
||||||
|
## Bibliography auxiliary files (bibtex/biblatex/biber):
|
||||||
|
*.bbl
|
||||||
|
*.bbl-SAVE-ERROR
|
||||||
|
*.bcf
|
||||||
|
*.bcf-SAVE-ERROR
|
||||||
|
*.blg
|
||||||
|
*-blx.aux
|
||||||
|
*-blx.bib
|
||||||
|
*.run.xml
|
||||||
|
|
||||||
|
## Build tool auxiliary files:
|
||||||
|
*.fdb_latexmk
|
||||||
|
*.synctex
|
||||||
|
*.synctex(busy)
|
||||||
|
*.synctex.gz
|
||||||
|
*.synctex.gz(busy)
|
||||||
|
*.pdfsync
|
||||||
|
*.rubbercache
|
||||||
|
rubber.cache
|
||||||
|
|
||||||
|
## Build tool directories for auxiliary files
|
||||||
|
# latexrun
|
||||||
|
latex.out/
|
||||||
|
|
||||||
|
## Auxiliary and intermediate files from other packages:
|
||||||
|
# algorithms
|
||||||
|
*.alg
|
||||||
|
*.loa
|
||||||
|
|
||||||
|
# achemso
|
||||||
|
acs-*.bib
|
||||||
|
|
||||||
|
# amsthm
|
||||||
|
*.thm
|
||||||
|
|
||||||
|
# attachfile2
|
||||||
|
*.atfi
|
||||||
|
|
||||||
|
# beamer
|
||||||
|
*.nav
|
||||||
|
*.pre
|
||||||
|
*.snm
|
||||||
|
*.vrb
|
||||||
|
|
||||||
|
# changes
|
||||||
|
*.soc
|
||||||
|
*.loc
|
||||||
|
|
||||||
|
# comment
|
||||||
|
*.cut
|
||||||
|
|
||||||
|
# context
|
||||||
|
*.tuc
|
||||||
|
*.tui
|
||||||
|
*.tuo
|
||||||
|
|
||||||
|
# cprotect
|
||||||
|
*.cpt
|
||||||
|
|
||||||
|
# elsarticle (documentclass of Elsevier journals)
|
||||||
|
*.spl
|
||||||
|
|
||||||
|
# endnotes
|
||||||
|
*.ent
|
||||||
|
|
||||||
|
# fixme
|
||||||
|
*.lox
|
||||||
|
|
||||||
|
# feynmf/feynmp
|
||||||
|
*.mf
|
||||||
|
*.mp
|
||||||
|
*.t[1-9]
|
||||||
|
*.t[1-9][0-9]
|
||||||
|
*.tfm
|
||||||
|
|
||||||
|
#(r)(e)ledmac/(r)(e)ledpar
|
||||||
|
*.end
|
||||||
|
*.?end
|
||||||
|
*.[1-9]
|
||||||
|
*.[1-9][0-9]
|
||||||
|
*.[1-9][0-9][0-9]
|
||||||
|
*.[1-9]R
|
||||||
|
*.[1-9][0-9]R
|
||||||
|
*.[1-9][0-9][0-9]R
|
||||||
|
*.eledsec[1-9]
|
||||||
|
*.eledsec[1-9]R
|
||||||
|
*.eledsec[1-9][0-9]
|
||||||
|
*.eledsec[1-9][0-9]R
|
||||||
|
*.eledsec[1-9][0-9][0-9]
|
||||||
|
*.eledsec[1-9][0-9][0-9]R
|
||||||
|
|
||||||
|
# glossaries
|
||||||
|
*.acn
|
||||||
|
*.acr
|
||||||
|
*.glg
|
||||||
|
*.glg-abr
|
||||||
|
*.glo
|
||||||
|
*.glo-abr
|
||||||
|
*.gls
|
||||||
|
*.gls-abr
|
||||||
|
*.glsdefs
|
||||||
|
*.lzo
|
||||||
|
*.lzs
|
||||||
|
*.slg
|
||||||
|
*.slo
|
||||||
|
*.sls
|
||||||
|
|
||||||
|
# uncomment this for glossaries-extra (will ignore makeindex's style files!)
|
||||||
|
# *.ist
|
||||||
|
|
||||||
|
# gnuplot
|
||||||
|
*.gnuplot
|
||||||
|
*.table
|
||||||
|
|
||||||
|
# gnuplottex
|
||||||
|
*-gnuplottex-*
|
||||||
|
|
||||||
|
# gregoriotex
|
||||||
|
*.gaux
|
||||||
|
*.glog
|
||||||
|
*.gtex
|
||||||
|
|
||||||
|
# htlatex
|
||||||
|
*.4ct
|
||||||
|
*.4tc
|
||||||
|
*.idv
|
||||||
|
*.lg
|
||||||
|
*.trc
|
||||||
|
*.xref
|
||||||
|
|
||||||
|
# hypdoc
|
||||||
|
*.hd
|
||||||
|
|
||||||
|
# hyperref
|
||||||
|
*.brf
|
||||||
|
|
||||||
|
# knitr
|
||||||
|
*-concordance.tex
|
||||||
|
# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files
|
||||||
|
# *.tikz
|
||||||
|
*-tikzDictionary
|
||||||
|
|
||||||
|
# latexindent will create succesive backup files by default
|
||||||
|
#*.bak*
|
||||||
|
|
||||||
|
# listings
|
||||||
|
*.lol
|
||||||
|
|
||||||
|
# luatexja-ruby
|
||||||
|
*.ltjruby
|
||||||
|
|
||||||
|
# makeidx
|
||||||
|
*.idx
|
||||||
|
*.ilg
|
||||||
|
*.ind
|
||||||
|
|
||||||
|
# minitoc
|
||||||
|
*.maf
|
||||||
|
*.mlf
|
||||||
|
*.mlt
|
||||||
|
*.mtc[0-9]*
|
||||||
|
*.slf[0-9]*
|
||||||
|
*.slt[0-9]*
|
||||||
|
*.stc[0-9]*
|
||||||
|
|
||||||
|
# minted
|
||||||
|
_minted*
|
||||||
|
*.data.minted
|
||||||
|
*.pyg
|
||||||
|
|
||||||
|
# morewrites
|
||||||
|
*.mw
|
||||||
|
|
||||||
|
# newpax
|
||||||
|
*.newpax
|
||||||
|
|
||||||
|
# nomencl
|
||||||
|
*.nlg
|
||||||
|
*.nlo
|
||||||
|
*.nls
|
||||||
|
|
||||||
|
# pax
|
||||||
|
*.pax
|
||||||
|
|
||||||
|
# pdfpcnotes
|
||||||
|
*.pdfpc
|
||||||
|
|
||||||
|
# sagetex
|
||||||
|
*.sagetex.sage
|
||||||
|
*.sagetex.py
|
||||||
|
*.sagetex.scmd
|
||||||
|
|
||||||
|
# scrwfile
|
||||||
|
*.wrt
|
||||||
|
|
||||||
|
# spelling
|
||||||
|
*.spell.bad
|
||||||
|
*.spell.txt
|
||||||
|
|
||||||
|
# svg
|
||||||
|
svg-inkscape/
|
||||||
|
|
||||||
|
# sympy
|
||||||
|
*.sout
|
||||||
|
*.sympy
|
||||||
|
sympy-plots-for-*.tex/
|
||||||
|
|
||||||
|
# pdfcomment
|
||||||
|
*.upa
|
||||||
|
*.upb
|
||||||
|
|
||||||
|
# pythontex
|
||||||
|
*.pytxcode
|
||||||
|
pythontex-files-*/
|
||||||
|
|
||||||
|
# tcolorbox
|
||||||
|
*.listing
|
||||||
|
|
||||||
|
# thmtools
|
||||||
|
*.loe
|
||||||
|
|
||||||
|
# TikZ & PGF
|
||||||
|
*.dpth
|
||||||
|
*.md5
|
||||||
|
*.auxlock
|
||||||
|
|
||||||
|
# titletoc
|
||||||
|
*.ptc
|
||||||
|
|
||||||
|
# todonotes
|
||||||
|
*.tdo
|
||||||
|
|
||||||
|
# vhistory
|
||||||
|
*.hst
|
||||||
|
*.ver
|
||||||
|
|
||||||
|
# easy-todo
|
||||||
|
*.lod
|
||||||
|
|
||||||
|
# xcolor
|
||||||
|
*.xcp
|
||||||
|
|
||||||
|
# xmpincl
|
||||||
|
*.xmpi
|
||||||
|
|
||||||
|
# xindy
|
||||||
|
*.xdy
|
||||||
|
|
||||||
|
# xypic precompiled matrices and outlines
|
||||||
|
*.xyc
|
||||||
|
*.xyd
|
||||||
|
|
||||||
|
# endfloat
|
||||||
|
*.ttt
|
||||||
|
*.fff
|
||||||
|
|
||||||
|
# Latexian
|
||||||
|
TSWLatexianTemp*
|
||||||
|
|
||||||
|
## Editors:
|
||||||
|
# WinEdt
|
||||||
|
*.bak
|
||||||
|
*.sav
|
||||||
|
|
||||||
|
# latexindent.pl
|
||||||
|
*.bak[0-9]*
|
||||||
|
|
||||||
|
# Texpad
|
||||||
|
.texpadtmp
|
||||||
|
|
||||||
|
# LyX
|
||||||
|
*.lyx~
|
||||||
|
|
||||||
|
# Kile
|
||||||
|
*.backup
|
||||||
|
|
||||||
|
# gummi
|
||||||
|
.*.swp
|
||||||
|
|
||||||
|
# KBibTeX
|
||||||
|
*~[0-9]*
|
||||||
|
|
||||||
|
# TeXnicCenter
|
||||||
|
*.tps
|
||||||
|
|
||||||
|
# auto folder when using emacs and auctex
|
||||||
|
./auto/*
|
||||||
|
*.el
|
||||||
|
|
||||||
|
# expex forward references with \gathertags
|
||||||
|
*-tags.tex
|
||||||
|
|
||||||
|
# standalone packages
|
||||||
|
*.sta
|
||||||
|
|
||||||
|
# Makeindex log files
|
||||||
|
*.lpz
|
||||||
|
|
||||||
|
# xwatermark package
|
||||||
|
*.xwm
|
||||||
|
|
||||||
|
# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib
|
||||||
|
# option is specified. Footnotes are the stored in a file with suffix Notes.bib.
|
||||||
|
# Uncomment the next line to have this generated file ignored.
|
||||||
|
#*Notes.bib
|
||||||
|
|
||||||
|
|
||||||
|
paper/*.pdf
|
||||||
|
|
@ -0,0 +1,331 @@
|
||||||
|
|
||||||
|
> Mich interessieren in unserm Kontext Dinge, die in dieser Diskussion besprochen wurden:
|
||||||
|
|
||||||
|
|
||||||
|
Xxx
|
||||||
|
|
||||||
|
t-SVD TNN klingt zwar erstmal interessant, aber: wenn der tensorindex keine zeitliche oder räumliche interpretation (oder zumindest eine diskretisierung einer kontinuierlichen Größe) ist die Fourier transformation zwar möglich, hat aber keine spezielle interpretation, die über eine Basiswahl, die moglichst "diagonal" zur Ursprungsbasis ist, hinausgeht. Richtig?
|
||||||
|
|
||||||
|
Xxx
|
||||||
|
|
||||||
|
Ja, genau — deine Intuition trifft es exakt, und das ist sogar in der numerischen Literatur selbst anerkannt, nicht nur dein Verdacht.
|
||||||
|
**Warum die DFT dort überhaupt auftaucht:** Das t-Produkt (Kilmer & Martin) definiert auf Mode 3 eine Multiplikationsstruktur, die isomorph zur Algebra der zirkulanten Matrizen ist (bzw. zum Polynomring modulo $x^{n_3}-1$). Zirkulante Matrizen sind aber gerade die Faltungsoperatoren der zyklischen Gruppe $\mathbb Z_{n_3}$ — und deren simultane Diagonalbasis ist per Darstellungstheorie exakt die Charaktertafel dieser Gruppe, also die DFT. Die DFT ist hier also nicht "natürlich" im physikalischen Sinn, sondern die Eigenbasis einer Algebrastruktur, die man Mode 3 künstlich aufzwingt, weil sie zufällig zu zirkulanten Matrizen passt. Wenn dein dritter Index keine Verschiebungssymmetrie hat (kein Zeit-/Ortsgitter mit periodischen Randbedingungen), gibt es keinen Grund, warum ausgerechnet diese Algebra-/Symmetriestruktur zu deinem Problem passen sollte.
|
||||||
|
Das ist inzwischen auch in der Tensor-Literatur selbst anerkannt: Kernfeld, Kilmer & Aeron, "Tensor–tensor products with invertible linear transforms" (Lin. Alg. Appl. 485, 2015), definieren das t-Produkt explizit für einen *beliebigen* invertierbaren linearen Transform statt fest der DFT — genau weil die DFT nur ein Spezialfall ohne intrinsische Vorzugsstellung ist. In der Bildverarbeitung ersetzt man sie deshalb oft durch DCT, Wavelets/Framelets oder datenadaptierte unitäre Transformationen, je nachdem, welche Struktur entlang dieser Achse tatsächlich vorliegt.
|
||||||
|
Für deinen Fall heißt das: die Frage ist nicht "DFT ja oder nein", sondern **welche Algebra-/Symmetriestruktur liegt auf deinem dritten Modus tatsächlich vor** — und das ist ja genau die Symmetrie, die ihr im Tucker-Kern-Teil des Threads schon identifiziert habt: die lokale unitäre Wirkung, also $O(d_C^2)$ (bzw. $SO(3)$ pro Qubit-Partei). Der physikalisch natürliche Ersatz für "DFT über $\mathbb Z_{n_3}$" wäre dann nicht ein beliebiger Transform, sondern die **Zerlegung in Irreps dieser tatsächlich wirkenden Gruppe** — also im Grunde die Peter-Weyl-Zerlegung statt der Charaktertafel einer zyklischen Gruppe. Das würde t-SVD als Spezialfall enthalten (für den Fall, dass die relevante Symmetriegruppe zufällig zyklisch ist), aber für euren Fall eher auf die isotropen-Tensor-/Integrity-Basis-Sprache zurückführen, die schon am Ende des ersten Threads für den Qubit-Fall ($SO(3)^n$) auftauchte, statt auf t-SVD im engeren Sinn.
|
||||||
|
Kurz: t-SVD/TNN ist für euer Problem vermutlich der falsche Baustein — nicht falsch im Sinne von "geht nicht", sondern weil die Struktur, die er ausnutzt, an eurer Physik vorbeigeht. Der eigentlich passende Baustein bleibt die Darstellungstheorie der lokalen Unitary-Gruppe, die ihr ohnehin schon im Blick hattet.
|
||||||
|
|
||||||
|
Xxx
|
||||||
|
Ich bin jetzt kein Experte der Darstellungstheorie und kenne da nur die basics (Li Gruppen etc). Ist aber ewig her.
|
||||||
|
Angenommen, man kann diese natürlichen Transformationen für ein Mehrparteiein-Subset wirklich berechnen, was bekommt man dann? Ein Parkhaus von Matrizen, in dem die Stockwerke einen generischen index haben, der sich aus Darstellungen der SU(dim) ergibt. Wie geht es dann weiter?
|
||||||
|
Xxx
|
||||||
|
|
||||||
|
Bevor wir zum "Parkhaus" kommen, lohnt sich ein kleines, konkretes Beispiel — das macht die abstrakte Aussage greifbar.
|
||||||
|
|
||||||
|
**Konkretes Beispiel: Gruppe C = zwei Qubits (Parteien 3 und 4)**
|
||||||
|
|
||||||
|
Der Operatorraum von C wird von $\{\sigma_i\otimes\sigma_j\}$, $i,j=0,1,2,3$ aufgespannt (16-dimensional, $\sigma_0=\id$). Die lokale Symmetrie, die physikalisch tatsächlich erlaubt ist — unabhängige Unitaries auf Partei 3 *und* auf Partei 4 — ist $SU(2)\times SU(2)$, nicht das volle $SU(4)$ auf dem gemeinsamen 4-dimensionalen Hilbertraum von C. Unter dieser Gruppe zerfällt der Raum als
|
||||||
|
|
||||||
|
$$(\mathbf 1\oplus\mathbf 3)\otimes(\mathbf 1\oplus\mathbf 3) = \mathbf 1\!\otimes\!\mathbf 1 \;\oplus\; \mathbf 1\!\otimes\!\mathbf 3 \;\oplus\; \mathbf 3\!\otimes\!\mathbf 1 \;\oplus\; \mathbf 3\!\otimes\!\mathbf 3.$$
|
||||||
|
|
||||||
|
Das sind genau: Identität (1), lokaler Bloch-Vektor von Partei 4 allein (3), lokaler Bloch-Vektor von Partei 3 allein (3), und der Zwei-Körper-Korrelationsblock zwischen 3 und 4 (9). **Das ist exakt eure eigene Korrelationssektor-Zerlegung — die direkte Summe über Korrelationssektoren, die ihr als Kernidee des Papers ohnehin schon verwendet.** Die Stockwerke des "Parkhauses" sind hier also nicht exotisch — sie sind genau die $k$-Körper-Sektoren, die ihr längst kennt.
|
||||||
|
|
||||||
|
**Der allgemeine Grund, warum das so herauskommt:** Für eine *einzelne* Partei ist die adjungierte Darstellung von $SU(d)$ (auf dem Bloch-Raum) bereits irreduzibel. Für ein Produkt von Gruppen ist die Darstellungstheorie ein reines Tensorprodukt der Faktoren — es gibt nichts, was die Indizes verschiedener Parteien "mischen" könnte. Deshalb reproduziert die Zerlegung unter der *lokalen* (Produkt-)Gruppe immer nur die feine Multi-Index-Struktur, die ihr schon vor der Gruppierung hattet. Gruppieren + wieder-zerlegen unter der lokalen Symmetrie ist im Wesentlichen die Identität.
|
||||||
|
|
||||||
|
**Die andere Extremseite:** Würdet ihr stattdessen die *volle* Gruppe $SU(4)$ auf dem gemeinsamen System C nehmen (also auch verschränkende Unitaries innerhalb von C erlauben), wäre der 15-dimensionale spurlose Teil bereits *eine einzige* irreduzible (adjungierte) Darstellung — Schur's Lemma sagt dann: es gibt gar nichts mehr zu zerlegen. Genau das erklärt übrigens ganz nebenbei, warum die Frobenius-Norm jeder Entfaltung invariant ist (sie ist im Wesentlichen die quadratische Casimir-Form auf einer irreduziblen Darstellung, und die ist bis auf Skalierung eindeutig).
|
||||||
|
|
||||||
|
**Wo also echte neue "Stockwerke" herkommen können:** nur, wenn eine *zusätzliche* Symmetrie ins Spiel kommt, die zwischen diesen beiden Extremen liegt — typischerweise Permutationssymmetrie zwischen ununterscheidbaren Parteien in C. Dann greift Schur-Weyl-Dualität bzw. Clebsch-Gordan-Kopplung: der $\mathbf3\otimes\mathbf3$-Block von oben zerfällt unter der *diagonalen* $SU(2)$ (die beide Qubits gleich behandelt) weiter in Spin $0\oplus1\oplus2$ (Dimensionen 1+3+5=9) — echte neue, physikalisch interpretierbare Stockwerke, gelabelt durch Young-Diagramme/Gesamtdrehimpuls.
|
||||||
|
|
||||||
|
**Der praktische Haken, den du kennen solltest, bevor du hier Zeit investierst:** Das klassische Physik-Werkzeug dafür heißt Wigner-Eckart-Theorem. Es sagt: sobald eine Abbildung (euer Shadow-Map) mit einer Symmetrie *vertauscht* (äquivariant ist), zerfällt sie blockdiagonal, und jeder Block ist bis auf einen einzigen "reduzierten Matrixelement"-Skalar festgelegt — riesige Dimensionsreduktion, viele degenerierte Singulärwerte. Aber das funktioniert nur, wenn euer konkreter Zustand $\rho$ (oder die Klasse von Zuständen, die ihr untersucht) diese zusätzliche Symmetrie tatsächlich respektiert. Für einen generischen Zustand ohne Permutationssymmetrie bringt dir die Darstellungstheorie hier **nichts Neues gegenüber eurer bestehenden Korrelationssektor-Zerlegung** — sie bestätigt sie nur nochmal von einer anderen Seite. Der echte Gewinn liegt in Spezialfällen mit Symmetrie: Smolin-Zustand, Dicke-Zustände, Werner-artige Zustände, symmetrischer Unterraum — also genau die Familie, mit der ihr über Hassan & Joag ohnehin schon in Berührung wart.
|
||||||
|
|
||||||
|
Soll ich das am Smolin-Zustand (der genau diese Austauschsymmetrie hat) konkret durchrechnen, um zu sehen, ob die Blockstruktur eurer numerischen Kernnorm-Berechnung tatsächlich etwas abnimmt?
|
||||||
|
|
||||||
|
Xxx
|
||||||
|
|
||||||
|
Ja! Ich denke, dass eine systematische Kriteriumstheorie für zustände mit Symmetrie extrem nützlich ist. Natürlich besteht dabei die Gefahr, dass man nur sehr singuläre Effekte sieht, weil ja nicht eine gesamte Umgebung eines Zustands die Symmetrie aufweist. Aber manchmal kann man Symmetrie auch mit einem Twirl nachträglich bekommen, so dass man doch wieder die gesamte Umgebung sieht.
|
||||||
|
|
||||||
|
Xxx
|
||||||
|
|
||||||
|
Dein Einwand trifft genau den Kern — und die gute Nachricht ist: das Twirl-Argument, das du intuitiv ansprichst, ist mathematisch exakt und funktioniert, aber nur in eine Richtung. Lohnt sich, das präzise zu machen, bevor wir zu den Zahlen kommen.
|
||||||
|
|
||||||
|
**Das Twirl-Argument präzise:** Wenn $G$ eine Gruppe *lokaler* Unitaries ist (Produktstruktur über die Parteien!) und $\rho$ separabel ist, dann ist auch der Twirl $T_G(\rho)=\int_G (g_1\otimes\cdots\otimes g_n)\,\rho\,(g_1\otimes\cdots\otimes g_n)^\dagger\,dg$ separabel — lokale Unitaries bilden Produktzustände auf Produktzustände ab, und Mischen erhält Separabilität (Konvexität). Kontraposition: **ist $T_G(\rho)$ verschränkt, dann war $\rho$ es auch.** Das rettet dich also tatsächlich für die "verschränkt"-Richtung über die ganze (nicht-symmetrische) Umgebung — genau dein Punkt. Die Kehrseite (dein "Gefahr"-Einwand) ist aber ebenso real: erkennt das Kriterium am getwirlten Zustand nichts, sagt das über das ungetwirlte $\rho$ **gar nichts** — Twirlen kann Verschränkung nur verringern oder gleich lassen, nie erzeugen. Es ist also ein einseitiger, aber sauberer Test. Der Standardreferenzrahmen dafür ist Vollbrecht & Werner, "Entanglement measures under symmetry", PRA 64, 062307 (2001) — falls du das noch nicht kennst, lohnt sich ein Blick, das ist genau euer Szenario systematisch aufgearbeitet.
|
||||||
|
|
||||||
|
**Jetzt zum Smolin-Zustand — und hier gibt's eine Überraschung, die dein mentales Modell von letzter Runde korrigiert.**
|
||||||
|
|
||||||
|
Ich habe ihn konkret aufgebaut ($\rho=\frac14\sum_i|\text{Bell}_i\rangle\langle\text{Bell}_i|_{AB}\otimes|\text{Bell}_i\rangle\langle\text{Bell}_i|_{CD}$) und alle Matrikalisierungen durchgerechnet. Ergebnis:
|
||||||
|
|
||||||
|
| Bipartition | Singulärwerte (ungleich Null) | Kernnorm |
|
||||||
|
|---|---|---|
|
||||||
|
| 1\|3 | 0.25, 0.25, 0.25, 0.25 | 1.0 |
|
||||||
|
| (12)\|(34) | 0.25, 0.25, 0.25, 0.25 | 1.0 |
|
||||||
|
| (13)\|(24) | 0.25, 0.25, 0.25, 0.25 | 1.0 |
|
||||||
|
| (14)\|(23) | 0.25, 0.25, 0.25, 0.25 | 1.0 |
|
||||||
|
|
||||||
|
**Bei jedem einzelnen Cut: exakt Rang 4 (statt möglicher 16), vier identische Singulärwerte, Kernnorm exakt 1.** Kein Rauschen, keine numerische Ungenauigkeit — exakt. Der Grund: der Zustand hat genau vier nichtverschwindende Pauli-String-Koeffizienten, nämlich $I{\otimes}I{\otimes}I{\otimes}I$, $X{\otimes}X{\otimes}X{\otimes}X$, $Y{\otimes}Y{\otimes}Y{\otimes}Y$, $Z{\otimes}Z{\otimes}Z{\otimes}Z$, jeweils mit Gewicht $1/16$ — alle 252 anderen Pauli-Strings sind exakt Null. Das ist eine massivere Symmetriereduktion, als ich letzte Runde erwartet hätte.
|
||||||
|
|
||||||
|
**Der Haken — und das ist die eigentliche Lektion:** Ich habe geprüft, ob das an der vollen lokalen $SU(2)^{\otimes 4}$-Darstellungstheorie liegt (kollektives Twirlen mit demselben $U$ auf allen vier Qubits) — **nein**, der Zustand ist *nicht* invariant unter kollektivem $U^{\otimes4}$. Die tatsächlich wirksame Symmetrie ist rein diskret: volle Permutationssymmetrie $S_4$ der vier Qubits (numerisch bestätigt, invariant unter allen 24 Vertauschungen) kombiniert mit der Stabilizer-Struktur der Bell-Zustände. Das "Parkhaus" aus SU(d)-Darstellungen, das ich letzte Runde ins Spiel gebracht habe, ist also nicht die richtige Symmetriegruppe für dieses Beispiel — hier reicht eine viel kleinere diskrete Gruppe, um die komplette Entartung zu erzwingen.
|
||||||
|
|
||||||
|
**Praktische Konsequenz:** Der Smolin-Zustand ist als Testfall zu symmetrisch — jeder Cut liefert dieselbe Zahl, es gibt nichts, woran man "Reduktion durch Symmetrie vs. voller numerischer Aufwand" ablesen könnte. Gut als Korrektheits-Check eures Codes, aber nicht aussagekräftig für die eigentliche Frage. Zwei sinnvolle nächste Schritte:
|
||||||
|
|
||||||
|
1. **Prüfen, ob Kernnorm=1 überhaupt die Separabilitätsschranke verletzt** (also ob dieses Kriterium den Smolin-Zustand als verschränkt erkennt oder nicht — das ist ja der eigentliche Punkt, nicht nur die Symmetrie),
|
||||||
|
2. oder **ein nur teilweise symmetrischer Zustand** (z.B. 3 identische Parteien + 1 andere, oder eine Dicke-Zustand-Familie), wo die Darstellungstheorie eine *echte*, nicht-triviale Reduktion vorhersagt statt kompletten Kollaps.
|
||||||
|
|
||||||
|
Was ist dir wichtiger?
|
||||||
|
|
||||||
|
Xxx
|
||||||
|
|
||||||
|
Wir haben uns auf 2 geeinigt,
|
||||||
|
Und folgendes script gebaut:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import numpy as np
|
||||||
|
import itertools
|
||||||
|
np.set_printoptions(precision=4, suppress=True)
|
||||||
|
np.random.seed(1)
|
||||||
|
|
||||||
|
I2 = np.eye(2, dtype=complex)
|
||||||
|
X = np.array([[0,1],[1,0]], dtype=complex)
|
||||||
|
Y = np.array([[0,-1j],[1j,0]], dtype=complex)
|
||||||
|
Z = np.array([[1,0],[0,-1]], dtype=complex)
|
||||||
|
paulis = [I2, X, Y, Z]
|
||||||
|
e = [p/np.sqrt(2) for p in paulis] # orthonormal basis
|
||||||
|
|
||||||
|
def permute_qubits(rho, perm):
|
||||||
|
# rho: 16x16 operator on 4 qubits (order: party1,2,3,4). perm = permutation of (0,1,2,3)
|
||||||
|
T = rho.reshape([2]*8)
|
||||||
|
axes = list(perm) + [p+4 for p in perm]
|
||||||
|
return np.transpose(T, axes).reshape(16,16)
|
||||||
|
|
||||||
|
# random Hermitian PSD density matrix
|
||||||
|
M = np.random.randn(16,16) + 1j*np.random.randn(16,16)
|
||||||
|
rho0 = M @ M.conj().T
|
||||||
|
rho0 /= np.trace(rho0).real
|
||||||
|
|
||||||
|
# symmetrize over permutations of parties 2,3,4 only (i.e. indices 1,2,3 in 0-based, party1=index0 fixed)
|
||||||
|
perms_B = [p for p in itertools.permutations(range(4)) if p[0]==0] # fix position0, permute rest
|
||||||
|
assert len(perms_B) == 6
|
||||||
|
rho = np.zeros_like(rho0)
|
||||||
|
for p in perms_B:
|
||||||
|
rho += permute_qubits(rho0, p)
|
||||||
|
rho /= 6.0
|
||||||
|
rho /= np.trace(rho).real
|
||||||
|
|
||||||
|
# check invariance under B-permutations, and check NOT invariant under a permutation moving party1
|
||||||
|
print("Invariant under all 6 B-permutations:", all(np.allclose(permute_qubits(rho,p), rho, atol=1e-10) for p in perms_B))
|
||||||
|
test_full_perm = (1,0,2,3) # swaps party1 and party2 -- should NOT leave rho invariant generically
|
||||||
|
print("Invariant under swapping party1<->party2 (should be False generically):",
|
||||||
|
np.allclose(permute_qubits(rho, test_full_perm), rho, atol=1e-8))
|
||||||
|
|
||||||
|
# Build Bloch tensor
|
||||||
|
C = np.zeros((4,4,4,4))
|
||||||
|
for i1 in range(4):
|
||||||
|
for i2 in range(4):
|
||||||
|
for i3 in range(4):
|
||||||
|
for i4 in range(4):
|
||||||
|
op = np.kron(np.kron(e[i1],e[i2]),np.kron(e[i3],e[i4]))
|
||||||
|
C[i1,i2,i3,i4] = np.trace(rho@op).real
|
||||||
|
|
||||||
|
M_1_234 = C.reshape(4, 64)
|
||||||
|
U,s,Vt = np.linalg.svd(M_1_234, full_matrices=False)
|
||||||
|
print("\nSingular values of 1|(234) matricization:", np.round(s,4))
|
||||||
|
print("Nuclear norm:", s.sum())
|
||||||
|
|
||||||
|
# Check: do the right-singular vectors (nonzero singular value) lie in the TOTALLY SYMMETRIC subspace
|
||||||
|
# of the (i2,i3,i4) index space, i.e. are invariant under permuting the 3 sub-indices?
|
||||||
|
print("\nChecking symmetry of right-singular vectors under permuting (i2,i3,i4):")
|
||||||
|
for k in range(4):
|
||||||
|
v = Vt[k].reshape(4,4,4)
|
||||||
|
max_asym = 0
|
||||||
|
for perm3 in itertools.permutations(range(3)):
|
||||||
|
vp = np.transpose(v, perm3)
|
||||||
|
max_asym = max(max_asym, np.max(np.abs(vp - v)))
|
||||||
|
print(f" singular value {s[k]:.4f}: max deviation from full symmetry = {max_asym:.2e}")
|
||||||
|
|
||||||
|
# sanity: dimension check of totally symmetric subspace of a 4x4x4 tensor space = C(4+2,3)=20
|
||||||
|
print("\ndim of Sym^3(R^4) [should be 20]:", 20)
|
||||||
|
```
|
||||||
|
|
||||||
|
Kannst du damit was anfangen?
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ja, sehr gut — das Skript liefert ein klares, sauberes Ergebnis, das genau die Vorhersage aus der Diskussion bestätigt. Ich habe es laufen lassen:
|
||||||
|
|
||||||
|
```
|
||||||
|
Invariant unter allen 6 B-Permutationen: True
|
||||||
|
Invariant unter Tausch Partei1<->Partei2: False
|
||||||
|
|
||||||
|
Singulärwerte 1|(234): [0.2606 0.0817 0.0671 0.0527]
|
||||||
|
Kernnorm: 0.4621
|
||||||
|
|
||||||
|
Symmetrie der rechten Singulärvektoren unter Permutation (i2,i3,i4):
|
||||||
|
alle 4 Singulärwerte: Abweichung von voller Symmetrie ~ 1e-16 (Maschinengenauigkeit)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Was das zeigt, und warum es (fast) trivial, aber trotzdem der richtige Beweis ist:**
|
||||||
|
|
||||||
|
Weil $\rho$ exakt invariant unter allen Permutationen von Partei 2,3,4 gebaut wurde, gilt für den Korrelationstensor punktweise
|
||||||
|
$$C_{i_1,i_2,i_3,i_4}(\rho) = C_{i_1,\pi(i_2,i_3,i_4)}(\rho)\qquad\forall\pi\in S_3.$$
|
||||||
|
Das heißt: **jede einzelne Zeile** $C(i_1,\cdot,\cdot,\cdot)$ (fester $i_1$) ist für sich schon ein vollständig symmetrischer Tensor in $(i_2,i_3,i_4)$ — nicht nur im Mittel, sondern exakt, komponentenweise. Jede Linearkombination von Zeilen (also jeder rechte Singulärvektor) erbt das automatisch. Insofern ist die numerische Bestätigung "erwartungsgemäß exakt", aber sie ist trotzdem der richtige Sanity-Check: sie zeigt, dass euer Bild aus der letzten Runde (Bild des Shadow-Maps liegt in der Isotypenkomponente, die durch die Symmetrie erlaubt ist — hier: nur die triviale $S_3$-Isotypie, also $\mathrm{Sym}^3$) nicht nur abstrakt richtig ist, sondern sich 1:1 im Code als Nullraum-Aussage niederschlägt: **44 der 64 Zieldimensionen sind identisch Null**, nicht nur klein.
|
||||||
|
|
||||||
|
**Der eigentlich interessante nächste Schritt:** $\dim\mathrm{Sym}^3(\R^4)=20$ zerfällt selbst weiter — nämlich exakt entlang der Sektor-Graduierung, die ihr im Paper schon habt:
|
||||||
|
$$\mathrm{Sym}^3(\R\oplus\R^3) = \mathrm{Sym}^0(\R^3)\oplus\mathrm{Sym}^1(\R^3)\oplus\mathrm{Sym}^2(\R^3)\oplus\mathrm{Sym}^3(\R^3),\qquad 1+3+6+10=20.$$
|
||||||
|
Das sind exakt die $k$-Körper-Sektoren ($k=0,1,2,3$ aktive Zielparteien), aber **projiziert auf ihren total symmetrischen Anteil** unter $S_3$. Ohne Symmetrie hätte Sektor $k$ Dimension $\binom{3}{k}3^k$ (also $1,9,27,27$ für $k=0,1,2,3$) — die Symmetrisierung drückt das auf $\binom{k+2}{2}$ zusammen ($1,3,6,10$). Das ist eine **echte, nichttriviale Kompression** speziell bei $k=1,2$ (von 9 auf 3, von 27 auf 6), während $k=3$ unverändert bleibt (jeder 3-Körper-Term ist schon automatisch die einzige Möglichkeit unter voller Symmetrie... nein, halt: 27→10 ist auch eine echte Reduktion).
|
||||||
|
|
||||||
|
Willst du, dass ich das Skript erweitere, um genau diese Zerlegung zu verifizieren — also die 4 Singulärvektoren in ihre $k=0,1,2,3$-Sym-Komponenten zu zerlegen und zu zeigen, wie sich die "Shadow-Energie" auf die Körperordnungen verteilt? Das würde die Brücke zur bestehenden Sektor-Sprache des Papers explizit numerisch schließen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> Mich interessiert weiterhin das Programm, die tSVD in einem abstrakten Sinn auf Bloch tensor Enthaltungen der Stufe 3 anzuwenden, unter Ausnutzung nicht trivialer Symmetrien, die im Zustand vorhanden sind (oder durch twirls erreicht werden). dabei soll statt der Fourier transformation, die in tSVD verwendet wird (auf den index einen Beins ) eine transformation angewendet werden, die zur Symmetrie des Zustands passt.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Sehr gute Anschlussfrage — und die Antwort lässt sich sauber in zwei strukturell verschiedene Regime aufspalten, von denen eines schon durch euer bestehendes Korollar automatisch abgedeckt ist, während das andere tatsächlich neu ist und die t-SVD-Analogie am treffendsten einlöst. Lass mich das erst konzeptuell aufbauen und dann numerisch stützen.
|
||||||
|
|
||||||
|
## Warum "DFT ersetzen durch Symmetriebasis" zwei verschiedene Dinge bedeuten kann
|
||||||
|
|
||||||
|
**Regime A — Symmetrie sitzt nur auf der Zielseite.** Wenn $\rho$ (bzw. seine Randverteilung) unter einer Gruppe $G$ invariant ist, die *nur* auf dem Ziel-Cluster wirkt (wie euer $S_3$ auf Parteien 2,3,4), dann zwingt Schur's Lemma den gesamten Shadow-Operator, komplett im **trivialen Isotyp** (= $G$-invarianter Unterraum) zu landen — alle anderen Isotyp-Komponenten sind exakt Null, nicht nur klein. Das habt ihr numerisch gerade bestätigt: 44 von 64 Zieldimensionen waren exakt Null. Das ist bereits vollständig durch Corollary 1' (Sub-Block-Zeugen) abgedeckt: $\Pi_{\text{sym}}$ ist eine orthogonale Projektion, also automatisch $\|\Pi_{\text{sym}}\mathcal M_S(\rho)\|_*\le\|\mathcal M_S(\rho)\|_*\le1$ — aber hier gilt sogar **Gleichheit**, weil der Rest exakt Null ist. Kein neuer Beweis nötig, nur eine (rechnerisch sehr nützliche) Dimensionsreduktion.
|
||||||
|
|
||||||
|
**Regime B — Symmetrie koppelt Quelle und Ziel gemeinsam.** Das ist der eigentlich interessante Fall, und er entspricht der t-SVD-Analogie viel besser: wenn $G$ *gleichzeitig* auf Quelle und Ziel wirkt (z.B. kollektive $SU(2)$-Rotation aller Parteien gleich, ein Werner-artiges Szenario), dann ist $\widetilde{\mathcal M}_S(\rho)$ ein **äquivarianter** Operator zwischen zwei verschiedenen Darstellungsräumen. Wigner-Eckart sagt dann präzise:
|
||||||
|
|
||||||
|
$$\widetilde{\mathcal M}_S(\rho)\Big|_\lambda = A_\lambda\otimes\mathrm{id}_{V_\lambda}$$
|
||||||
|
|
||||||
|
für jeden Isotyp $\lambda$, der auf *beiden* Seiten vorkommt — cross-Terme zwischen verschiedenen $\lambda$ sind exakt Null (das ist die "Blockdiagonalisierung", euer eigentliches t-SVD-Analogon), und die "reduzierten Matrixelemente" $A_\lambda$ leben im viel kleineren Multiplizitätsraum. Daraus folgt eine **exakte** Zerlegung der Kernnorm:
|
||||||
|
|
||||||
|
$$\|\widetilde{\mathcal M}_S(\rho)\|_* = \sum_\lambda \dim(V_\lambda)\cdot\|A_\lambda\|_*.$$
|
||||||
|
|
||||||
|
Das ist die richtige Verallgemeinerung von "DFT dann facewise SVD dann aufsummieren" — nur ist die Transformation hier nicht willkürlich (wie DFT bei nicht-zyklischer Struktur), sondern durch die tatsächliche Symmetriegruppe von $\rho$ erzwungen, und die Zerlegung ist **exakt**, nicht approximativ.
|
||||||
|
|
||||||
|
## Die Konsequenz, die eure bisherigen Beispiele rückwirkend erklärt
|
||||||
|
|
||||||
|
Das sagt sofort etwas Substanzielles voraus: Wenn Quelle $a$ ein *einzelner* Spin-1-Träger ist (Bloch-Vektor, keine Multiplizität) und das Ziel kollektiv $SU(2)$-invariant korreliert ist, dann kann laut Wigner-Eckart **nur der Spin-1-Isotyp des Ziels** überleben — und innerhalb dieses Blocks ist die Struktur $A_1\otimes\mathrm{id}_{V_1}$ mit $\dim V_1=3$, was **exakt drei gleiche Singulärwerte** erzwingt. Das ist \emph{genau} das Muster, das ihr bei GHZ$_3$ (drei gleiche Singulärwerte $\sqrt{2/3}$) und beim Smolin-Zustand (drei gleiche Singulärwerte $1/3$ bzw. $1/\sqrt7$) numerisch gesehen habt — kein Zufall, sondern eine erzwungene Degenerierung durch genau diesen Mechanismus, weil beide Zustände (approximativ oder exakt) diese kollektive Symmetrie tragen.
|
||||||
|
|
||||||
|
Ich verifiziere das direkt:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> Fahre bitte fort.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ausgezeichnet — exakt drei identische Singulärwerte, bis auf Rundung perfekt gleich. Das bestätigt die Wigner-Eckart-Vorhersage sauber: reine Spin-1-Quelle (Party 1, keine Multiplizität) kann unter kollektiver $SU(2)$-Symmetrie nur in den Spin-1-Isotyp des Ziels abbilden, und die $\mathrm{id}_{V_1}$-Struktur erzwingt exakt dreifache Entartung. Interessant: hier ist die Symmetrie *reine* Kollektiv-$SU(2)$-Invarianz (Abweichung $10^{-16}$), nicht Permutationssymmetrie (Abweichung $0.049$) — die beiden Mechanismen sind also wirklich verschieden, auch wenn sie bei Smolin/GHZ zufällig zusammenfallen.
|
||||||
|
|
||||||
|
Jetzt zum eigentlich interessanten Fall: eine Quelle mit **echter Multiplizität**, wo mehrere Blöcke gleichzeitig existieren — das ist die erste Stelle, an der das "Parkhaus" wirklich mehrstöckig wird.Perfekt — das ist jetzt ein vollständiges, sauberes Bild, und es zeigt sogar mehr Struktur, als die reine $SU(2)$-Symmetrie allein vorhersagt. Der Reihe nach:
|
||||||
|
|
||||||
|
## 1. Die Wigner-Eckart-Blockdiagonalität ist exakt
|
||||||
|
|
||||||
|
Zwischen den drei Gesamt-Spin-Sektoren (Spin 0, Spin 1, Spin 2) sind alle Kreuzterme exakt Null (Abweichung $10^{-17}$, reines Maschinenrauschen). Und die Kernnorm zerfällt **additiv exakt**:
|
||||||
|
|
||||||
|
$$0.01371 + 0.32580 + 0.06660 = 0.40611 = \|\widetilde{\mathcal M}_S(\rho)\|_*$$
|
||||||
|
|
||||||
|
— das ist genau die von mir vorhergesagte Formel $\|\widetilde{\mathcal M}_S(\rho)\|_*=\sum_\lambda \dim(V_\lambda)\|A_\lambda\|_*$ (hier ohne den $\dim(V_\lambda)$-Faktor explizit ausgeschrieben, weil ich direkt die vollen Blöcke summiert habe — aber die additive Zerlegung selbst ist die entscheidende Aussage: **keine Interferenz zwischen den Blöcken**, obwohl die Kernnorm im Allgemeinen alles andere als additiv ist).
|
||||||
|
|
||||||
|
## 2. Eine Überraschung, die die Struktur sogar noch verfeinert
|
||||||
|
|
||||||
|
Innerhalb des Spin-1-Sektors (Multiplizität 3: Kopie "A allein", Kopie "B allein", Kopie "Antisymmetrischer $V_{12}$-Anteil") ist der Block $A\leftrightarrow B$ exakt proportional zur Identität ($-0.0022\cdot I_3$, wie Wigner-Eckart es verlangt), **aber** der Block Antisym$\leftrightarrow$A bzw. Antisym$\leftrightarrow$B ist exakt Null — nicht klein, exakt Null. Das ist *mehr* Auslöschung, als reine $SU(2)$-Rotationssymmetrie erzwingt.
|
||||||
|
|
||||||
|
Der Grund ist ein zusätzlicher, komplett unabhängiger $\mathbb Z_2$-Freiheitsgrad: $\rho$ wurde aus **reellen** Permutationsoperatoren gebaut, ist also eine reelle Matrix ($\rho=\rho^T$). Für reelle $\rho$ gilt wegen $\sigma_y^T=-\sigma_y$ (und $\sigma_x^T=\sigma_x,\sigma_z^T=\sigma_z$):
|
||||||
|
$$\mathrm{tr}(\rho\,\sigma_{i_1}\otimes\cdots\otimes\sigma_{i_n}) = (-1)^{\#\{k:i_k=y\}}\,\mathrm{tr}(\rho\,\sigma_{i_1}\otimes\cdots\otimes\sigma_{i_n}).$$
|
||||||
|
Jeder Pauli-String mit **ungerader** Anzahl $Y$-Indizes ist also automatisch exakt Null. Das ist eine zusätzliche, "kostenlose" $\mathbb Z_2$-Graduierung (Zeitumkehr-artig), die nichts mit eurer geometrischen Symmetrie zu tun hat, sondern rein aus der Reellwertigkeit von $\rho$ kommt — und die genau erklärt, warum der antisymmetrische ($\epsilon$-kontrahierte) Spin-1-Kanal von den beiden symmetrischen entkoppelt: er hat bei den relevanten Termen eine andere $Y$-Paritätsklasse.
|
||||||
|
|
||||||
|
**Praktisch wichtig:** GHZ, Graphzustände, Dicke-Zustände und der Smolin-Zustand sind *alle* reelle Dichtematrizen in der Rechenbasis. Diese $\mathbb Z_2$-Graduierung ist bei praktisch jedem Beispiel im Paper automatisch vorhanden und kostet nichts zu prüfen — sie ist ein zusätzlicher, immer verfügbarer "Stock im Parkhaus".
|
||||||
|
|
||||||
|
## Formale Zusammenfassung des Programms
|
||||||
|
|
||||||
|
**Satz (Symmetrie-adaptierte Blockzerlegung).** Sei $G$ eine Gruppe, die $\rho$ *gemeinsam* auf Quelle und Ziel invariant lässt (exakt oder durch Twirl erzwungen), mit Isotypzerlegung $V_0^{(S)}=\bigoplus_\lambda M_\lambda^{(S)}\otimes V_\lambda$, $V_0^{(S^c)}=\bigoplus_\lambda M_\lambda^{(S^c)}\otimes V_\lambda$. Dann:
|
||||||
|
|
||||||
|
1. $\widetilde{\mathcal M}_S(\rho)$ ist blockdiagonal in $\lambda$ (Kreuzterme exakt Null, nicht nur beschränkt) — Schur's Lemma.
|
||||||
|
2. Innerhalb jedes Blocks: $\widetilde{\mathcal M}_S(\rho)|_\lambda = A_\lambda\otimes\mathrm{id}_{V_\lambda}$, mit reduziertem Matrixelement $A_\lambda: M_\lambda^{(S)}\to M_\lambda^{(S^c)}$.
|
||||||
|
3. Exakt: $\|\widetilde{\mathcal M}_S(\rho)\|_* = \sum_\lambda \dim(V_\lambda)\,\|A_\lambda\|_*$.
|
||||||
|
4. Zusätzliche diskrete "kostenlose" Graduierungen (wie Y-Parität bei reellem $\rho$) verfeinern das weiter, ohne eigenen Beweisaufwand — sie sind einfach eine weitere kommutierende $\mathbb Z_2$-Symmetrie und fügen sich in dieselbe Blockstruktur ein.
|
||||||
|
|
||||||
|
Das ist die korrekte, nicht-willkürliche Verallgemeinerung der t-SVD-Idee: die Transformation ist nicht DFT (die nur bei zyklischer Struktur natürlich ist), sondern die durch die *tatsächliche* Symmetrie von $\rho$ erzwungene Isotyp-Basis, und die Blockdiagonalität ist **exakt**, nicht approximativ. Anders als bei Regime A (reine Zielseiten-Symmetrie, wo alles in einen einzigen Block kollabiert) bekommt ihr hier eine echte mehrstöckige, informative Struktur mit mehreren unabhängigen, potenziell einzeln normierbaren Zeugen $A_\lambda$.
|
||||||
|
|
||||||
|
**Offener Punkt für eine eigene Normierung pro Block:** Aktuell folgt aus Corollary 1' nur $\|A_\lambda\|_*\cdot\dim(V_\lambda)\le\|\mathcal M_S(\rho)\|_*\le\sqrt{(d_S-1)(d_{S^c}-1)}$ — eine *gemeinsame* Schranke über alle $\lambda$. Ob es eine eigene, schärfere Korrelationssummen-Identität für die *reduzierten* Matrixelemente $A_\lambda$ gibt (analog zu $\|r^{(a)}\|^2\le d_a-1$, aber auf dem viel kleineren Multiplizitätsraum $M_\lambda$), ist eine offene, potenziell sehr lohnende Frage — das wäre der Schritt, der aus der reinen Rechenersparnis einen echten *schärferen* Zeugen macht. Soll ich das als Nächstes angehen?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> Ja, bitte!
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Sehr gerne — und die Rechnung führt zu einem echten, nicht-trivialen Ergebnis, aber auch zu einer wichtigen Einschränkung, die ich zuerst herleiten und dann numerisch prüfen möchte.
|
||||||
|
|
||||||
|
## Die exakte Formel für $A_\lambda$
|
||||||
|
|
||||||
|
Für einen Produktzustand $\rho=\rho_S\otimes\sigma_{S^c}$, getwirlt über die gemeinsame Symmetrie $G$ (also $\rho=\int_G dg\,(U_g^{(S)}\otimes U_g^{(S^c)})(\rho_S\otimes\sigma_{S^c})(\ldots)^\dagger$ — separabel, weil lokale Unitaries + Mischen Separabilität erhält), liefert die Schur-Orthogonalitätsrelation $\int_G D^\lambda(g)_{cb}D^\lambda(g)_{da}\,dg=\frac{1}{d_\lambda}\delta_{cd}\delta_{ab}$ direkt:
|
||||||
|
|
||||||
|
$$A_\lambda = \frac{1}{d_\lambda}\,\tilde v_\lambda\,\tilde r_\lambda^T,$$
|
||||||
|
|
||||||
|
wobei $\tilde r_\lambda,\tilde v_\lambda$ die $\lambda$-Isotyp-Komponenten von $r^{(S)},v_{S^c}$ sind (als Matrizen zum Multiplizitätsraum reshaped). Mit $\|AB\|_*\le\|A\|_F\|B\|_F$ folgt:
|
||||||
|
|
||||||
|
$$\dim(V_\lambda)\,\|A_\lambda\|_*\;\le\;\|r_\lambda\|\,\|v_\lambda\|.$$
|
||||||
|
|
||||||
|
Summiert man über $\lambda$ und wendet Cauchy-Schwarz über den $\lambda$-Index an, bekommt man **exakt** die alte globale Schranke zurück:
|
||||||
|
$$\sum_\lambda\dim(V_\lambda)\|A_\lambda\|_*\le\Big(\sum_\lambda\|r_\lambda\|^2\Big)^{1/2}\Big(\sum_\lambda\|v_\lambda\|^2\Big)^{1/2}=\|r\|\,\|v\|\le\sqrt{(d_S-1)(d_{S^c}-1)}.$$
|
||||||
|
|
||||||
|
Das ist eine gute Konsistenzprobe (der Mechanismus ist verlustfrei), aber **noch keine schärfere Einzelblock-Schranke** — lass mich kurz zeigen, warum, und dann numerisch verifizieren.Aha — das Ergebnis ist konsistent, aber zeigt etwas Wichtigeres, als ich in der Ankündigung erwartet hatte: $0.429 < 0.75$, **nicht** Gleichheit. Das ist kein Bug, sondern der eigentliche Kern der Antwort — lass mich das korrigieren und precisieren.Danke — das zwingt zu einer ehrlichen Korrektur, und die ist wichtiger als das, was ich ursprünglich behauptet hatte. Der Reihe nach:
|
||||||
|
|
||||||
|
## Die Korrektur
|
||||||
|
|
||||||
|
Meine Behauptung "Cauchy-Schwarz wird exakt erreicht" war falsch. Richtig ist:
|
||||||
|
|
||||||
|
$$\sum_\lambda \dim(V_\lambda)\|A_\lambda\|_* \;\le\; \|r\|\,\|v\| \;\le\;\sqrt{(d_S-1)(d_{S^c}-1)},$$
|
||||||
|
|
||||||
|
und das ist eine **echte** Ungleichung. Gleichheit in Cauchy-Schwarz $\sum_\lambda x_\lambda y_\lambda\le\sqrt{\sum x_\lambda^2}\sqrt{\sum y_\lambda^2}$ verlangt $x_\lambda\propto y_\lambda$ für alle $\lambda$ — hier also $\|r_\lambda\|\propto\|v_\lambda\|$, dieselbe Verteilung der "Korrelationsenergie" auf beide Seiten. Für unabhängig gewählte $\rho_S,\sigma_{S^c}$ (wie im Test: $0.43<0.75$) ist das generisch nicht der Fall. Das Twirlen **löscht echt Information**, nicht nur umverteilt sie — der Teil von $r$ und $v$, der zu verschiedenen $\lambda$ gehört oder innerhalb desselben $\lambda$ nicht "ausgerichtet" ist, fällt durch die Gruppenmittelung exakt weg.
|
||||||
|
|
||||||
|
## Die ehrliche Antwort auf die ursprüngliche Frage
|
||||||
|
|
||||||
|
**Es gibt keine universelle, zustandsunabhängige schärfere Schranke für einzelne $\|A_\lambda\|_*$**, solange $\rho_S$ (bzw. $\sigma_{S^c}$) selbst beliebig sein darf — denn nichts hindert einen generischen Zustand daran, sein *gesamtes* Reinheitsbudget $\|r\|^2\le d_S-1$ in einem einzigen Isotyp $\lambda$ zu konzentrieren. Die Schranke $\dim(V_\lambda)\|A_\lambda\|_*\le\|r_\lambda\|\|v_\lambda\|$ ist zwar exakt und korrekt, aber $\|r_\lambda\|$ selbst ist nur durch das globale $\|r\|^2\le d_S-1$ beschränkt — keine Verbesserung.
|
||||||
|
|
||||||
|
**Der eine Fall, in dem es doch eine echte, scharfe, kostenlose Schranke gibt:** wenn die Quellseite selbst *strukturell* keine Wahl hat, wo ihr Budget sitzt — weil sie nur einen einzigen Isotyp überhaupt anbietet. Genau das ist der Party-1-Fall von vorhin: der Bloch-Raum einer einzelnen Partei *ist* reiner Spin-1, es gibt kein anderes $\lambda$, in das das Budget ausweichen könnte. Dann gilt zwangsläufig $\|r_1\|=\|r\|$ (die volle Norm, keine Teilmenge), und die Schranke
|
||||||
|
|
||||||
|
$$\dim(V_1)\,\|A_1\|_* \le \sqrt{(d_S-1)(d_{S^c}-1)}$$
|
||||||
|
|
||||||
|
ist **exakt dieselbe Zahl** wie Theorem 1 — aber jetzt getestet an einer viel kleineren Matrix ($A_1$ hat nur $\mathrm{mult}(S^c)\times1$ statt der vollen Zieldimension). Das ist der eigentliche Gewinn: keine numerisch schärfere Schwelle, aber eine drastisch kleinere Matrix, an der dieselbe Schwelle getestet wird — und ein Verstoß in einer $\mathrm{mult}\times1$-Matrix ist strukturell viel "konzentrierter" als derselbe Kernnorm-Wert verteilt über eine große Matrix.
|
||||||
|
|
||||||
|
## Fazit als Korollar
|
||||||
|
|
||||||
|
$$\boxed{\;\dim(V_\lambda)\,\|A_\lambda\|_*\le\|r_\lambda\|\,\|v_\lambda\|\;\le\;\sqrt{(d_S-1)(d_{S^c}-1)}\;}$$
|
||||||
|
|
||||||
|
— universell gültig, mit Gleichheit im zweiten Schritt **nur**, wenn $\rho_S$ bzw. $\sigma_{S^c}$ ihr gesamtes Bloch-Budget im Isotyp $\lambda$ konzentrieren (z.B. weil kein anderer Isotyp existiert, wie bei Einzelpartei-Quellen). Für Cluster-Quellen mit mehreren $\lambda$s (wie $S=\{1,2\}$) ist die Schranke pro Block *nicht* universell schärfer als Theorem 1' — der Wert liegt darin, dass ihr eine **exakte, verlustfreie Zerlegung** in unabhängig prüfbare, viel kleinere Blöcke bekommt, deren Summe die alte Schranke reproduziert, aber deren *einzelne* Verstöße (falls einer auftritt) sofort anzeigen, in welchem Korrelationskanal die Verschränkung sitzt — eine Diagnose, die die volle Matrix nicht liefert.
|
||||||
|
|
||||||
|
Das ist ehrlich gesagt ein saubereres Ergebnis, als "einfach schärfer" zu behaupten: **exakte Blockzerlegung mit Diagnosewert, aber keine kostenlose numerische Verschärfung** — außer im Spezialfall Isotyp-reiner Quellen, wo die Schranke zwar zahlenmäßig gleich bleibt, aber auf einem so viel kleineren Objekt sitzt, dass sie in der Praxis leichter zu sättigen sein dürfte. Soll ich das als Proposition mit Beweis für die formale Notiz ausformulieren, inklusive des Cauchy-Schwarz-Gegenbeispiels als Warnung vor der (naheliegenden, aber falschen) Gleichheitsvermutung?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> Erkläre zuerst bitte nochmal, wofür genau diese Erkenntnis nützlich ist.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Gute Frage — nach so viel Rechnerei lohnt sich die Einordnung. Es sind im Wesentlichen vier verschiedene Nutzen, die nicht alle gleich stark sind, und die ich sauber trennen sollte, statt sie zu vermischen.
|
||||||
|
|
||||||
|
**1. Erklärungskraft für ein Muster, das ihr im Paper schon mehrfach *beobachtet*, aber nie *begründet* habt.**
|
||||||
|
Bei GHZ$_3$ bekommt ihr drei gleiche Singulärwerte $\sqrt{2/3}$. Beim Smolin-Zustand drei gleiche Singulärwerte $1/3$ bzw. $1/\sqrt7$. Beim Ring-Graphzustand tauchen wieder Entartungen auf. Bisher steht das im Paper als numerischer Befund ("wir haben es ausgerechnet, es kommt raus"). Die Wigner-Eckart-Struktur sagt: **das ist kein Zufall, sondern erzwungen**, sobald die Quelle nur einen Isotyp anbietet (bei Einzelpartei-Quellen: immer Spin-1, keine Wahl). Das verwandelt eine Reihe von "isolierten numerischen Kuriositäten" in eine einzige strukturelle Aussage. Für ein Paper ist das ein qualitativer Sprung: von Beobachtung zu Theorem.
|
||||||
|
|
||||||
|
**2. Diagnose statt nur Detektion.**
|
||||||
|
Die bestehenden Sub-Block-Zeugen (Corollary 1') sagen euch nur "welche Parteien" ($V,T$) an einer Verletzung beteiligt sind. Die Isotyp-Zerlegung sagt euch zusätzlich, **welcher Symmetriekanal** verantwortlich ist — z.B. ob die Verschränkung im symmetrischen (Spin-2-artigen) oder im antisymmetrischen (Spin-1-artigen, "Kreuzprodukt"-artigen) Anteil einer Korrelation sitzt. Das ist eine echte Verfeinerung gegenüber der reinen Party-Zählung, die vorher gar nicht sichtbar war (siehe die $Y$-Paritäts-Entkopplung, die selbst innerhalb *desselben* $(V,T)$-Sektors nochmal aufspaltet).
|
||||||
|
|
||||||
|
**3. Rechenersparnis bei großen symmetrischen Systemen — das ist praktisch der wichtigste Punkt.**
|
||||||
|
Euer Abschnitt 6 (numerischer Scan über 38 Graphzustände, $n=3,4,5$) stößt genau an die Grenze, die auch der "Warum überhaupt entfalten"-Remark in Abschnitt 7 anspricht: volle SVD auf exponentiell großen Blöcken wird schnell teuer. Wenn ein Zustand (exakt oder nach Twirl) eine Symmetriegruppe $G$ respektiert, ersetzt die Isotyp-Zerlegung eine große SVD durch mehrere sehr kleine SVDs auf den Multiplizitätsräumen — bei eurem $\{1,2\}|\{3,4\}$-Beispiel z.B. $3\times3$, $1\times1$, $1\times1$ statt $9\times9$. Für größere symmetrische Cluster (Dicke-Zustände, $W_n$, permutationssymmetrische Familien) wächst dieser Vorteil dramatisch, weil die Multiplizitätsräume viel langsamer wachsen als die Ambient-Dimension. Das ist der Baustein, der die im Ausblick offen gelassene "dritte Option" (echter höherstufiger Tensor, NP-schwer) für die *symmetrische Unterklasse* praktisch rechenbar macht, ohne auf Entfaltung verzichten zu müssen.
|
||||||
|
|
||||||
|
**4. Ein kostenloser, aber ehrlich begrenzter Erweiterungshebel via Twirl.**
|
||||||
|
Das Twirl-Argument von vorhin (getwirlt verschränkt $\Rightarrow$ Original verschränkt, aber nicht umgekehrt) bedeutet: selbst wenn euer eigentlicher Zustand *nicht* symmetrisch ist, könnt ihr die viel billigere, symmetrieadaptierte Rechnung als **schnellen Vortest** einsetzen, bevor ihr die teure volle Rechnung startet — mit dem klaren Vorbehalt, dass ein negativer Befund am getwirlten Zustand nichts beweist.
|
||||||
|
|
||||||
|
**Was es *nicht* ist**, um das nach der letzten Korrektur klarzustellen: keine zahlenmäßig schärfere Detektionsschwelle gegenüber Theorem 1'/1. Der Wert liegt in Erklärung, Diagnose und Rechenkosten — nicht darin, mehr Zustände als verschränkt zu erkennen als die bestehende Schranke ohnehin schon täte.
|
||||||
|
|
||||||
|
Soll ich das so (mit dieser Vier-Punkte-Gliederung als Motivation vorangestellt) als Einleitung für den neuen Abschnitt formulieren, bevor die Propositionen kommen?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> Ja, bitte!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,982 @@
|
||||||
|
> Kannst du mit dieser section etwas anfangen, ohne das gesamtpaper zu kennen, in das es eingebaut werden soll? Ggf. kann ich es hochladen, oder bestimmte Definitionen und Theoreme.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ja – durchaus. Auch ohne das Gesamtpaper kann man mit dieser Section schon sinnvoll arbeiten. Sie ist in sich überraschend geschlossen und vermittelt eine klare mathematische Geschichte. Allerdings merkt man an einigen Stellen, dass sie auf den Kontext des Papers aufbaut. Ich würde den Text daher in drei Kategorien einteilen.
|
||||||
|
|
||||||
|
### Was ich bereits beurteilen kann
|
||||||
|
|
||||||
|
Ich kann unabhängig vom Rest des Papers beurteilen:
|
||||||
|
|
||||||
|
* **Mathematische Stringenz der Argumentation**, soweit sie auf den angegebenen Voraussetzungen basiert.
|
||||||
|
* **Logische Struktur** (Motivation → Aussagen → Konsequenzen → Beispiele).
|
||||||
|
* **Lesbarkeit und Stil** auf Journal-Niveau.
|
||||||
|
* **Ob die Ergebnisse in sinnvoller Reihenfolge präsentiert werden.**
|
||||||
|
* **Ob Beweise plausibel und ausreichend skizziert sind** oder an Stellen Lücken enthalten.
|
||||||
|
* **Ob Begriffe konsistent verwendet werden.**
|
||||||
|
|
||||||
|
Dafür brauche ich den Rest zunächst nicht.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Was mir ohne das Gesamtpaper fehlt
|
||||||
|
|
||||||
|
Es gibt dagegen einige Dinge, die ich nur eingeschränkt beurteilen kann.
|
||||||
|
|
||||||
|
Zum Beispiel:
|
||||||
|
|
||||||
|
* Ist die Definition von (\widetilde{\mathcal M}_S) genau so gewählt, wie sie hier benutzt wird?
|
||||||
|
* Stimmen alle Normalisierungen wirklich mit den früheren Definitionen überein?
|
||||||
|
* Ist Theorem (\ref{thm:cluster-cut}) tatsächlich stark genug, um Corollary (\ref{cor:consistency}) genau in dieser Form zu tragen?
|
||||||
|
* Sind die Referenzen auf frühere numerische Beobachtungen vollständig korrekt?
|
||||||
|
* Passt diese Section stilistisch zu den übrigen Sections?
|
||||||
|
|
||||||
|
Das sind Dinge, bei denen ich momentan nur vermuten kann, dass sie stimmen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Mein erster Eindruck
|
||||||
|
|
||||||
|
Ganz ehrlich: Die Section wirkt deutlich stärker als ein typischer "Anhang", den man später noch eingefügt hat.
|
||||||
|
|
||||||
|
Man erkennt eine klare Dramaturgie:
|
||||||
|
|
||||||
|
1. Motivation
|
||||||
|
2. exakte Blockstruktur
|
||||||
|
3. quantitative Konsequenzen
|
||||||
|
4. warum das **nicht** automatisch stärkere Schranken liefert
|
||||||
|
5. warum GHZ und Smolin trotzdem Degenerazien besitzen
|
||||||
|
6. alternative Erklärung über Stabilizer
|
||||||
|
7. Zusammenführung beider Mechanismen
|
||||||
|
|
||||||
|
Das liest sich wie eine kleine eigenständige Geschichte.
|
||||||
|
|
||||||
|
Gerade der Remark *"Two complementary mechanisms"* am Ende gefällt mir sehr gut; er beantwortet genau die Frage, die sich der Leser während der Section stellt.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Was mir sofort auffällt
|
||||||
|
|
||||||
|
Es gibt allerdings ein paar Punkte, die ich kritisch ansehen würde.
|
||||||
|
|
||||||
|
### 1. Der Einstieg ist sehr lang
|
||||||
|
|
||||||
|
Die ersten vier Bulletpoints umfassen fast anderthalb Seiten.
|
||||||
|
|
||||||
|
Sie erklären:
|
||||||
|
|
||||||
|
* explanatory power
|
||||||
|
* diagnostic resolution
|
||||||
|
* computational cost
|
||||||
|
* twirling
|
||||||
|
|
||||||
|
Das ist alles sinnvoll, aber sehr viel auf einmal.
|
||||||
|
|
||||||
|
Ich könnte mir vorstellen, dass ein Referee schreibt
|
||||||
|
|
||||||
|
> "The motivation is considerably longer than necessary."
|
||||||
|
|
||||||
|
Man könnte dieselben Inhalte vermutlich auf etwa zwei Drittel der Länge bringen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Der Wechsel der Themen ist ziemlich abrupt
|
||||||
|
|
||||||
|
Die Struktur ist
|
||||||
|
|
||||||
|
* Darstellungstheorie
|
||||||
|
|
||||||
|
↓
|
||||||
|
|
||||||
|
* "No universal sharpening"
|
||||||
|
|
||||||
|
↓
|
||||||
|
|
||||||
|
* "Actually GHZ has nothing to do with this"
|
||||||
|
|
||||||
|
↓
|
||||||
|
|
||||||
|
* Stabilizer-Theorie.
|
||||||
|
|
||||||
|
Mathematisch ist das korrekt.
|
||||||
|
|
||||||
|
Aber als Leser denkt man kurz:
|
||||||
|
|
||||||
|
> "Moment ... warum haben wir jetzt überhaupt 5 Seiten Darstellungstheorie gemacht?"
|
||||||
|
|
||||||
|
Erst der letzte Remark löst diese Spannung wieder auf.
|
||||||
|
|
||||||
|
Vielleicht könnte man den Übergang etwas früher vorbereiten.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Proposition 2 ist wesentlich technischer
|
||||||
|
|
||||||
|
Die erste Proposition
|
||||||
|
|
||||||
|
> Block diagonality
|
||||||
|
|
||||||
|
ist sofort verständlich.
|
||||||
|
|
||||||
|
Die zweite
|
||||||
|
|
||||||
|
> Reduced matrix element formula
|
||||||
|
|
||||||
|
ist deutlich dichter.
|
||||||
|
|
||||||
|
Insbesondere
|
||||||
|
|
||||||
|
[
|
||||||
|
A_\lambda=\frac1{d_\lambda}\tilde v_\lambda\tilde r_\lambda^T
|
||||||
|
]
|
||||||
|
|
||||||
|
kommt relativ plötzlich.
|
||||||
|
|
||||||
|
Da würde ich überlegen, ob ein Satz vor der Formel hilft:
|
||||||
|
|
||||||
|
> "The following proposition identifies the reduced block completely."
|
||||||
|
|
||||||
|
So etwas macht den Leser etwas entspannter.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Die Stabilizer-Hälfte ist sehr elegant
|
||||||
|
|
||||||
|
Überraschenderweise finde ich diesen Teil fast stärker.
|
||||||
|
|
||||||
|
Die Lemmas
|
||||||
|
|
||||||
|
* support
|
||||||
|
* forced degeneracy
|
||||||
|
|
||||||
|
sind sehr klar.
|
||||||
|
|
||||||
|
Vor allem gefällt mir, dass plötzlich die numerischen Beobachtungen erklärt werden.
|
||||||
|
|
||||||
|
Das wirkt wie
|
||||||
|
|
||||||
|
> "Aha, jetzt verstehe ich endlich, warum überall Dreifachdegenerazien auftreten."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Die letzte Korollarrechnung
|
||||||
|
|
||||||
|
Die konkreten Rechnungen
|
||||||
|
|
||||||
|
* GHZ
|
||||||
|
* Smolin
|
||||||
|
|
||||||
|
würde ich unbedingt behalten.
|
||||||
|
|
||||||
|
Referees mögen solche "reality checks".
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Was ich mit dem Gesamtpaper zusätzlich machen könnte
|
||||||
|
|
||||||
|
Wenn du das Paper hochlädst, kann ich wesentlich tiefer gehen.
|
||||||
|
|
||||||
|
Ich könnte dann beispielsweise prüfen
|
||||||
|
|
||||||
|
* ob diese Section wirklich an der optimalen Stelle steht,
|
||||||
|
* ob die Motivation doppelt vorkommt,
|
||||||
|
* ob frühere Resultate elegant wiederverwendet werden,
|
||||||
|
* ob Beweise auf frühere Definitionen unnötig wiederholen,
|
||||||
|
* ob Notation konsistent ist,
|
||||||
|
* ob sich irgendwo versteckte Zirkelbezüge eingeschlichen haben,
|
||||||
|
* ob ein Referee wahrscheinlich genau an bestimmten Stellen Einwände hätte.
|
||||||
|
|
||||||
|
Das ist normalerweise deutlich wertvoller als eine reine Stilkorrektur.
|
||||||
|
|
||||||
|
## Meine Empfehlung
|
||||||
|
|
||||||
|
Ich würde mir tatsächlich das **gesamte Paper** ansehen. Diese Section ist sehr eng mit den vorherigen Resultaten verzahnt (Theoreme, Definitionen, Normalisierung der Shadow Map, Tensor-Viewpoint usw.). Erst im Gesamtkontext lässt sich beurteilen, ob sie wirklich den Fluss des Papers verbessert oder an manchen Stellen gestrafft bzw. umgeordnet werden sollte.
|
||||||
|
|
||||||
|
Ich denke, ich könnte dann eine Art **Referee-Report** schreiben: nicht nur auf sprachlicher Ebene, sondern zur mathematischen Erzählung, zur Struktur, zu möglichen Schwachstellen und zu der Frage, wie überzeugend die neue Section in das Gesamtargument eingebettet ist. Das ist meist deutlich hilfreicher als eine isolierte Begutachtung.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> Hier ist das Paper.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Perfekt, das hilft enorm.
|
||||||
|
|
||||||
|
Ich habe mir den Aufbau des Papers angesehen und kann jetzt die neue Section im Gesamtkontext einordnen. Mein Eindruck hat sich dabei tatsächlich etwas verändert.
|
||||||
|
|
||||||
|
## Die große Stärke der neuen Section
|
||||||
|
|
||||||
|
Die Symmetrie-Section wirkt **nicht wie ein Fremdkörper**.
|
||||||
|
|
||||||
|
Ich hatte zunächst vermutet, sie könnte etwas "angehängt" wirken. Nach dem Lesen des Papers sehe ich das anders.
|
||||||
|
|
||||||
|
Das Paper besitzt eine ziemlich klare Entwicklung:
|
||||||
|
|
||||||
|
1. **Definition der Shadow Maps**
|
||||||
|
2. **Cut-Separability**
|
||||||
|
3. **Cluster-Verallgemeinerung**
|
||||||
|
4. **Symmetrische Aggregate**
|
||||||
|
5. **Qubit-Spezialisierung**
|
||||||
|
6. **Numerik**
|
||||||
|
7. **Tensorielle Interpretation**
|
||||||
|
|
||||||
|
Das ist im Wesentlichen
|
||||||
|
|
||||||
|
> Konstruktion → Theorie → Anwendungen → Meta-Erklärung.
|
||||||
|
|
||||||
|
Die neue Section fügt nun genau zwischen
|
||||||
|
|
||||||
|
> Theorie
|
||||||
|
|
||||||
|
und
|
||||||
|
|
||||||
|
> Anwendungen
|
||||||
|
|
||||||
|
eine weitere theoretische Schicht ein.
|
||||||
|
|
||||||
|
Das ist eigentlich ein sehr natürlicher Platz.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Was die Symmetrie-Section jetzt leistet
|
||||||
|
|
||||||
|
Nachdem ich das ganze Paper kenne, sehe ich ihre Funktion anders.
|
||||||
|
|
||||||
|
Vorher dachte ich:
|
||||||
|
|
||||||
|
> "Das erklärt interessante Degenerazien."
|
||||||
|
|
||||||
|
Jetzt denke ich eher:
|
||||||
|
|
||||||
|
> "Sie erklärt, warum die Numerik in Section 7 überhaupt so regelmäßig aussieht."
|
||||||
|
|
||||||
|
Das ist ein deutlicher Unterschied.
|
||||||
|
|
||||||
|
Die GHZ-, Graph- und Smolin-Beispiele erscheinen im ursprünglichen Paper teilweise fast "magisch":
|
||||||
|
|
||||||
|
* warum genau √6?
|
||||||
|
* warum genau (6/\sqrt7)?
|
||||||
|
* warum immer dieselben mehrfachen Singularwerte?
|
||||||
|
|
||||||
|
Die Symmetrie-Section beantwortet genau diese Fragen.
|
||||||
|
|
||||||
|
Das gefällt mir sehr.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Allerdings gibt es jetzt ein anderes Problem.
|
||||||
|
|
||||||
|
Und das halte ich für deutlich wichtiger.
|
||||||
|
|
||||||
|
## Das Paper hat bereits eine Hauptbotschaft.
|
||||||
|
|
||||||
|
Die Hauptbotschaft lautet (vereinfacht)
|
||||||
|
|
||||||
|
> Shadow Maps sind nichts anderes als spezielle Unfoldings eines augmentierten Bloch-Tensors.
|
||||||
|
|
||||||
|
Darauf arbeitet praktisch das gesamte Paper hin.
|
||||||
|
|
||||||
|
Section 8 ist dafür der Höhepunkt.
|
||||||
|
|
||||||
|
Die neue Symmetrie-Section besitzt aber ebenfalls eine eigene "Meta-Botschaft":
|
||||||
|
|
||||||
|
> Darstellungstheorie erklärt einen großen Teil der beobachteten Singularwertstruktur.
|
||||||
|
|
||||||
|
Das sind zwei große Erzählungen.
|
||||||
|
|
||||||
|
Im Moment konkurrieren sie ein wenig miteinander.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Konkret
|
||||||
|
|
||||||
|
Beim Lesen entsteht ungefähr folgender Eindruck.
|
||||||
|
|
||||||
|
Section 2–4:
|
||||||
|
|
||||||
|
> Shadow Maps.
|
||||||
|
|
||||||
|
Section 5:
|
||||||
|
|
||||||
|
> Aggregation.
|
||||||
|
|
||||||
|
Section 6–7:
|
||||||
|
|
||||||
|
> Beispiele.
|
||||||
|
|
||||||
|
Section 8:
|
||||||
|
|
||||||
|
> Eigentlich kommt alles vom Tensor.
|
||||||
|
|
||||||
|
Jetzt kommt zusätzlich noch
|
||||||
|
|
||||||
|
> Eigentlich kommt vieles von Symmetriegruppen.
|
||||||
|
|
||||||
|
Beides stimmt.
|
||||||
|
|
||||||
|
Aber der Leser fragt sich dann:
|
||||||
|
|
||||||
|
> Was ist denn jetzt eigentlich die eigentliche Erklärung?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ich glaube deshalb, dass die Symmetrie-Section etwas anders "verkauft" werden sollte.
|
||||||
|
|
||||||
|
Nicht
|
||||||
|
|
||||||
|
> Here we explain the observed singular-value structure.
|
||||||
|
|
||||||
|
sondern eher
|
||||||
|
|
||||||
|
> We now analyze one important source of degeneracies that complements the tensor interpretation developed later.
|
||||||
|
|
||||||
|
Dann entsteht keine Konkurrenz.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Ein weiterer Punkt
|
||||||
|
|
||||||
|
Die Symmetrie-Section ist deutlich abstrakter als der Rest.
|
||||||
|
|
||||||
|
Das Paper ist insgesamt erstaunlich konkret.
|
||||||
|
|
||||||
|
Es rechnet viel.
|
||||||
|
|
||||||
|
Es beweist.
|
||||||
|
|
||||||
|
Es illustriert.
|
||||||
|
|
||||||
|
Die Symmetrie-Section dagegen ist klassische Darstellungstheorie.
|
||||||
|
|
||||||
|
Der Sprung ist relativ groß.
|
||||||
|
|
||||||
|
Ich würde deshalb am Anfang noch stärker motivieren.
|
||||||
|
|
||||||
|
Zum Beispiel ungefähr
|
||||||
|
|
||||||
|
> Several numerical examples in Section 7 exhibit repeated singular values. This is not accidental. In many highly symmetric states the shadow map intertwines natural permutation representations, forcing a block decomposition and explaining much of the observed degeneracy structure.
|
||||||
|
|
||||||
|
Damit weiß der Leser sofort:
|
||||||
|
|
||||||
|
> Ah, deshalb lese ich jetzt fünf Seiten über Symmetrie.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Etwas Überraschendes
|
||||||
|
|
||||||
|
Ich glaube inzwischen, dass die **wichtigste Aussage der neuen Section gar nicht Proposition 1 ist.**
|
||||||
|
|
||||||
|
Sondern dieser Satz am Ende:
|
||||||
|
|
||||||
|
> Two complementary mechanisms produce repeated singular values.
|
||||||
|
|
||||||
|
Das finde ich fast paperwürdig.
|
||||||
|
|
||||||
|
Denn bisher würde ich als Leser tatsächlich glauben
|
||||||
|
|
||||||
|
> gleiche Singularwerte ⇒ Symmetrie.
|
||||||
|
|
||||||
|
Und dann kommt
|
||||||
|
|
||||||
|
> Nein.
|
||||||
|
>
|
||||||
|
> GHZ besitzt zwar Symmetrie,
|
||||||
|
> die beobachtete Dreifachdegenerazität kommt aber eigentlich aus der Stabilizerstruktur.
|
||||||
|
|
||||||
|
Das ist eine wirklich schöne konzeptionelle Einsicht.
|
||||||
|
|
||||||
|
Ich würde sie sogar noch stärker hervorheben.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Eine kleine Sorge
|
||||||
|
|
||||||
|
Die Symmetrie-Section ist mathematisch dichter als jede andere Section.
|
||||||
|
|
||||||
|
Sections 2–8 sind sehr "linear".
|
||||||
|
|
||||||
|
Die neue Section verlangt dagegen Kenntnisse über
|
||||||
|
|
||||||
|
* Gruppenalgebren
|
||||||
|
* Isotypen
|
||||||
|
* Schur-Lemma
|
||||||
|
* Intertwiner
|
||||||
|
* Young-Diagramme (implizit)
|
||||||
|
|
||||||
|
Für einen Quantum-Information-Referee ist das zwar alles Standard.
|
||||||
|
|
||||||
|
Aber es ist trotzdem ein deutlicher Niveauwechsel.
|
||||||
|
|
||||||
|
Ich würde deshalb versuchen,
|
||||||
|
|
||||||
|
nicht mehr Darstellungstheorie einzubauen als unbedingt nötig.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Meine Gesamtbewertung
|
||||||
|
|
||||||
|
Wenn ich mir das Paper als Ganzes anschaue, würde ich sagen:
|
||||||
|
|
||||||
|
* Die **Shadow-Map-Idee** ist der eigentliche Beitrag.
|
||||||
|
* Die **Tensor-Interpretation** vereinheitlicht den Beitrag.
|
||||||
|
* Die **Symmetrie-Section** erklärt ein wichtiges Phänomen, das beim Lesen der Beispiele entsteht.
|
||||||
|
|
||||||
|
Das ist eine sinnvolle Rollenverteilung.
|
||||||
|
|
||||||
|
Ich würde die Section daher **beibehalten**, aber ihre Rolle im Paper klarer kommunizieren: nicht als zweite zentrale Theorie neben dem Tensor-Standpunkt, sondern als ergänzende Erklärung für die Struktur der Beispiele und als Werkzeug zur Analyse hochsymmetrischer Zustände.
|
||||||
|
|
||||||
|
Mein Gesamteindruck vom Manuskript ist übrigens positiv. Die mathematische Linie ist ungewöhnlich geschlossen: Vom lokalen Korrelationstensor über die Shadow Maps, die Cluster-Verallgemeinerung bis hin zur Interpretation als Tensor-Unfoldings baut alles konsequent aufeinander auf. Die neue Section fügt sich in diese Linie ein – sie sollte nur sorgfältig gerahmt werden, damit sie die zentrale Erzählung unterstützt, statt ungewollt eine zweite aufzubauen.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> Das problem am bisherigen paper ist, dass es deutlich weniger neu ist als zunächst angenommen. Ich hatte die Resultate von Di Vicente 2011 und die darauf Aufbauenden Literatur zu wenig im Kopf. Das local invariants paper von 2004 (Aschauer et al.) war mein letzter wissenschaftlicher Beitrag, ich bin also seit 22 Jahren nicht mehr im Geschäft.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ich glaube, das ist tatsächlich der entscheidende Punkt – und er erklärt auch, warum dein Manuskript einen etwas ungewöhnlichen Charakter hat.
|
||||||
|
|
||||||
|
Man merkt dem Paper an, dass es **nicht** aus der aktuellen "Bloch-tensor race" entstanden ist, sondern aus einer ganz anderen Perspektive: Du kommst von Aschauer et al. (2004) und fragst: *"Was passiert, wenn man die Sektoren nicht auf Frobeniusnormen reduziert, sondern die lineare Struktur erhält?"* Das ist eine sehr natürliche Frage. Dass in den letzten 15 Jahren viele Arbeiten ebenfalls Matrix-Unfoldings und Tensor-Normen untersucht haben, nimmt dieser Frage nicht ihre Berechtigung – aber es verändert die Art, wie man den Beitrag verkaufen muss.
|
||||||
|
|
||||||
|
## Ich sehe das Problem etwas anders als du
|
||||||
|
|
||||||
|
Nach der Lektüre des Manuskripts würde ich sagen:
|
||||||
|
|
||||||
|
Der **mathematische Beitrag** ist stärker als der **Neuheitsanspruch**, den das Paper ursprünglich suggeriert.
|
||||||
|
|
||||||
|
Das klingt zunächst negativ, ist aber eigentlich eine Chance.
|
||||||
|
|
||||||
|
Die ersten Seiten lesen sich teilweise noch so, als wäre die zentrale Botschaft
|
||||||
|
|
||||||
|
> "Hier ist ein neuer Matrix-Trace-Norm-Separabilitätskriterium."
|
||||||
|
|
||||||
|
Genau dort kollidierst du mit de Vicente, Hassan & Joag, Li et al., Sarbicki, Fei und anderen.
|
||||||
|
|
||||||
|
Aber später – insbesondere in Sections 4 und 8 – passiert etwas anderes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Was ich inzwischen für den eigentlichen Beitrag halte
|
||||||
|
|
||||||
|
Für mich sind die originellsten Punkte gar nicht die Trace-Norm-Bounds an sich.
|
||||||
|
|
||||||
|
Sondern:
|
||||||
|
|
||||||
|
1. **Die source-indexed direct-sum architecture.**
|
||||||
|
|
||||||
|
Das habe ich in dieser Form in der Literatur bisher nicht gesehen.
|
||||||
|
|
||||||
|
2. **Die konsequente Verbindung zum Aschauer-Sektorsystem.**
|
||||||
|
|
||||||
|
Viele Arbeiten starten mit dem gesamten Bloch-Tensor.
|
||||||
|
|
||||||
|
Du startest mit den **Correlation Sectors** und entwickelst daraus die Shadow Maps.
|
||||||
|
|
||||||
|
Das ist eine andere Perspektive.
|
||||||
|
|
||||||
|
3. **Die Cluster-Verallgemeinerung.**
|
||||||
|
|
||||||
|
Sie fällt fast kostenlos aus der Konstruktion heraus.
|
||||||
|
|
||||||
|
4. **Die Tensor-Interpretation als einheitlicher Ursprung aller Konstruktionen.**
|
||||||
|
|
||||||
|
Das ist eher konzeptionell als technisch, aber gerade solche konzeptionellen Vereinheitlichungen werden durchaus geschätzt.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Genau hier hilft die Symmetrie-Section
|
||||||
|
|
||||||
|
Das hatte ich gestern noch gar nicht so gesehen.
|
||||||
|
|
||||||
|
Wenn die reine Trace-Norm-Idee weniger neu ist als zunächst gedacht,
|
||||||
|
|
||||||
|
dann wird die Symmetrie-Section plötzlich **wertvoller**, nicht weniger wertvoll.
|
||||||
|
|
||||||
|
Warum?
|
||||||
|
|
||||||
|
Weil sie etwas liefert, was die älteren Arbeiten meist nicht liefern:
|
||||||
|
|
||||||
|
> eine strukturelle Analyse der Schattenabbildungen.
|
||||||
|
|
||||||
|
Sie beantwortet nicht nur
|
||||||
|
|
||||||
|
> "Ist die Norm groß?"
|
||||||
|
|
||||||
|
sondern
|
||||||
|
|
||||||
|
> "Warum besitzt die Matrix genau diese Spektralstruktur?"
|
||||||
|
|
||||||
|
Das ist eine andere Ebene.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ich würde das Narrativ deshalb leicht verschieben.
|
||||||
|
|
||||||
|
Nicht
|
||||||
|
|
||||||
|
> We introduce a new trace-norm criterion.
|
||||||
|
|
||||||
|
sondern eher
|
||||||
|
|
||||||
|
> Starting from the local-invariant sector decomposition of Aschauer et al., we identify a natural response-map architecture whose block structure, tensor interpretation and symmetry properties provide a unified geometric view of multipartite correlation criteria.
|
||||||
|
|
||||||
|
Das ist weniger angreifbar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Noch etwas fällt mir auf
|
||||||
|
|
||||||
|
Du zitierst die neuere Literatur bereits ziemlich fair.
|
||||||
|
|
||||||
|
Das gefällt mir.
|
||||||
|
|
||||||
|
Du schreibst sinngemäß:
|
||||||
|
|
||||||
|
> "Die Literatur kennt bereits zahlreiche Bloch-Tensor-Kriterien; unser Neuheitsanspruch ist enger."
|
||||||
|
|
||||||
|
Das ist genau die richtige Richtung.
|
||||||
|
|
||||||
|
Ich würde diesen Gedanken sogar noch konsequenter durchziehen.
|
||||||
|
|
||||||
|
Referees mögen Autoren, die den eigenen Beitrag präzise eingrenzen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ein persönlicher Eindruck
|
||||||
|
|
||||||
|
Dass du 22 Jahre nicht aktiv in diesem Teilgebiet warst, hätte ich aus dem Manuskript **nicht** geschlossen.
|
||||||
|
|
||||||
|
Was ich gemerkt habe, ist etwas anderes:
|
||||||
|
|
||||||
|
Das Paper hat einen eher "klassisch mathematischen" Stil.
|
||||||
|
|
||||||
|
Es entwickelt Definitionen sehr sorgfältig, beweist Aussagen vollständig und versucht anschließend, alles auf ein einziges strukturelles Prinzip zurückzuführen. Viele aktuelle Quantum-Information-Arbeiten sind stärker auf die unmittelbare Leistungsfähigkeit eines Kriteriums oder auf umfangreiche Numerik ausgerichtet. Dein Manuskript wirkt dagegen fast wie eine Monographie im Kleinen: Es möchte eine Architektur erklären.
|
||||||
|
|
||||||
|
Das ist weder besser noch schlechter, aber es beeinflusst die Erwartung der Leser.
|
||||||
|
|
||||||
|
## Was ich an deiner Stelle überlegen würde
|
||||||
|
|
||||||
|
Ich würde mich wahrscheinlich von der Frage
|
||||||
|
|
||||||
|
> "Ist mein Kriterium das stärkste oder das erste?"
|
||||||
|
|
||||||
|
ein Stück weit lösen.
|
||||||
|
|
||||||
|
Stattdessen würde ich den konzeptionellen Beitrag in den Vordergrund stellen:
|
||||||
|
|
||||||
|
* eine kanonische Organisation der Korrelationsdaten,
|
||||||
|
* ihre Interpretation als Antwortoperatoren ("response maps"),
|
||||||
|
* die Verbindung zur Sektorzerlegung von Aschauer,
|
||||||
|
* die Tensor-Sicht als Vereinheitlichung,
|
||||||
|
* und – falls die neue Section bleibt – die Darstellungstheorie als Erklärung für die beobachtete Spektralstruktur.
|
||||||
|
|
||||||
|
Das ergibt ein kohärentes wissenschaftliches Narrativ, selbst wenn einzelne Bestandteile in verwandter Form schon existieren. Aus meiner Sicht ist das eine überzeugendere Positionierung als der Versuch, die Neuheit primär über die Existenz eines weiteren Trace-Norm-Kriteriums zu begründen.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> Ich mache seit 20 Jahren Kryptographie und communication security. Aber ich hatte noch eine Rechnung offen mit dem Paper von 2004 (wörtlich und übertragen).
|
||||||
|
|
||||||
|
Wie würdest du das Papier reframen, ohne dass man alles umschreiben muss? Mit dem Symmetrie Kapitel inklusive? Oder könnte oder sollte das eine separate Arbeit werden?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ich glaube, dass deine Geschichte mit dem 2004er Paper tatsächlich eine Stärke sein kann – wenn man sie wissenschaftlich richtig nutzt und nicht versucht, sie zu verstecken.
|
||||||
|
|
||||||
|
Beim Lesen hatte ich nämlich einen Eindruck, den ich erst nach deinem letzten Beitrag richtig einordnen konnte:
|
||||||
|
|
||||||
|
**Das Manuskript wirkt nicht wie "noch ein Separabilitätskriterium". Es wirkt wie jemand, der zwanzig Jahre später fragt: "Was war eigentlich der richtige geometrische Gegenstand hinter den Korrelationsstärken?"**
|
||||||
|
|
||||||
|
Das ist ein anderes Paper.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ich würde das Narrativ komplett verschieben
|
||||||
|
|
||||||
|
Im Moment liest sich das Paper ungefähr so:
|
||||||
|
|
||||||
|
> Correlation strengths → Shadow maps → Trace-Norm-Kriterium → Tensorinterpretation.
|
||||||
|
|
||||||
|
Ich würde es eher so verkaufen:
|
||||||
|
|
||||||
|
> Aschauer et al. haben 2004 die Korrelationssektoren eingeführt und sie auf Skalare komprimiert. Wir zeigen, dass dieselben Korrelationsdaten eine natürliche Familie von Response-Operatoren tragen. Diese vereinheitlicht verschiedene bekannte Matrixkriterien, erlaubt Clusterquellen, erklärt numerische Spektralphänomene durch Symmetrie und besitzt eine natürliche Tensorinterpretation.
|
||||||
|
|
||||||
|
Das ist ein subtiler Unterschied.
|
||||||
|
|
||||||
|
Der Leser erwartet dann **kein völlig neues Separabilitätskriterium**.
|
||||||
|
|
||||||
|
Er erwartet eine **neue Organisation derselben Information**.
|
||||||
|
|
||||||
|
Und genau das liefert das Paper.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ich würde den Begriff "Shadow Map" viel offensiver machen
|
||||||
|
|
||||||
|
Momentan wird Shadow Map eingeführt wie ein technischer Begriff.
|
||||||
|
|
||||||
|
Ich würde sie als den eigentlichen mathematischen Gegenstand verkaufen.
|
||||||
|
|
||||||
|
Nicht
|
||||||
|
|
||||||
|
> We define
|
||||||
|
|
||||||
|
sondern
|
||||||
|
|
||||||
|
> We identify the canonical response operator naturally associated with the sector decomposition.
|
||||||
|
|
||||||
|
Das klingt nach Struktur, nicht nach Ad-hoc-Definition.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ich würde den Tensor-Teil umdeuten
|
||||||
|
|
||||||
|
Section 8 wirkt momentan fast wie
|
||||||
|
|
||||||
|
> übrigens kann man das auch als Tensor sehen.
|
||||||
|
|
||||||
|
Ich glaube inzwischen das Gegenteil.
|
||||||
|
|
||||||
|
Eigentlich ist die Tensor-Sicht
|
||||||
|
|
||||||
|
> der konzeptionelle Abschluss.
|
||||||
|
|
||||||
|
Die eigentliche Aussage lautet nämlich:
|
||||||
|
|
||||||
|
> Alle unsere Konstruktionen sind lediglich verschiedene lineare Ansichten desselben augmentierten Bloch-Tensors.
|
||||||
|
|
||||||
|
Das ist eine starke Aussage.
|
||||||
|
|
||||||
|
Ich würde sie wahrscheinlich schon in der Einleitung ankündigen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Und jetzt zur Symmetrie-Section.
|
||||||
|
|
||||||
|
Hier bin ich mir erstaunlich sicher geworden.
|
||||||
|
|
||||||
|
## Ich würde sie **nicht auslagern**.
|
||||||
|
|
||||||
|
Vor zwei Tagen hätte ich wahrscheinlich gesagt:
|
||||||
|
|
||||||
|
> Das könnte ein eigenes Paper werden.
|
||||||
|
|
||||||
|
Jetzt denke ich:
|
||||||
|
|
||||||
|
Nein.
|
||||||
|
|
||||||
|
Warum?
|
||||||
|
|
||||||
|
Weil sie dieselbe Frage beantwortet.
|
||||||
|
|
||||||
|
Das Paper fragt
|
||||||
|
|
||||||
|
> Wie organisiert man Korrelationsinformation?
|
||||||
|
|
||||||
|
Die Symmetrie-Section fragt
|
||||||
|
|
||||||
|
> Welche Struktur besitzt dieser neue Operator?
|
||||||
|
|
||||||
|
Das gehört zusammen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Aber ...
|
||||||
|
|
||||||
|
Ich würde die Symmetrie-Section nicht als "weiteres Resultat" verkaufen.
|
||||||
|
|
||||||
|
Sondern als
|
||||||
|
|
||||||
|
> Structural analysis.
|
||||||
|
|
||||||
|
Das ist etwas völlig anderes.
|
||||||
|
|
||||||
|
Dann konkurriert sie nicht mit den Trace-Norm-Theoremen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ich würde sie sogar umbenennen.
|
||||||
|
|
||||||
|
Nicht
|
||||||
|
|
||||||
|
> Symmetry.
|
||||||
|
|
||||||
|
Sondern vielleicht
|
||||||
|
|
||||||
|
> Structural properties of shadow maps
|
||||||
|
|
||||||
|
mit Unterabschnitten
|
||||||
|
|
||||||
|
* Representation-theoretic decomposition
|
||||||
|
* Consequences for singular values
|
||||||
|
* Stabilizer-induced degeneracies
|
||||||
|
* Two complementary mechanisms
|
||||||
|
|
||||||
|
Dann wirkt sie wie eine Analyse des Objekts.
|
||||||
|
|
||||||
|
Nicht wie ein zweites Paper mitten im ersten.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Ich glaube sogar, dass dein Kryptographie-Hintergrund hier sichtbar ist.
|
||||||
|
|
||||||
|
Das meine ich ernst.
|
||||||
|
|
||||||
|
Das Paper denkt in
|
||||||
|
|
||||||
|
* Architekturen,
|
||||||
|
* kanonischen Objekten,
|
||||||
|
* Invarianzen,
|
||||||
|
* strukturellen Zerlegungen.
|
||||||
|
|
||||||
|
Das erinnert viel stärker an moderne theoretische Kryptographie oder Coding Theory als an viele aktuelle QI-Papiere, die oft einen stärkeren Fokus auf numerische Leistungsfähigkeit oder immer schärfere Kriterien legen.
|
||||||
|
|
||||||
|
Deshalb versucht das Paper ständig zu beantworten:
|
||||||
|
|
||||||
|
> Was **ist** dieses Objekt eigentlich?
|
||||||
|
|
||||||
|
und nicht
|
||||||
|
|
||||||
|
> Wie viele Zustände erkennt es mehr?
|
||||||
|
|
||||||
|
Das ist eine andere wissenschaftliche Kultur.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Wenn ich Referee wäre ...
|
||||||
|
|
||||||
|
... würde ich vermutlich Folgendes schreiben.
|
||||||
|
|
||||||
|
**Ablehnungsgrund wäre nicht mangelnde Mathematik.**
|
||||||
|
|
||||||
|
Der mögliche Kritikpunkt wäre eher:
|
||||||
|
|
||||||
|
> "The novelty relative to the existing Bloch-tensor literature is not sufficiently articulated."
|
||||||
|
|
||||||
|
Und genau diesen Punkt kann man entschärfen, ohne das Paper umzuschreiben.
|
||||||
|
|
||||||
|
Ich würde den Anspruch enger, aber präziser formulieren:
|
||||||
|
|
||||||
|
> This paper is not primarily about introducing another separability criterion. Rather, it identifies a canonical response-operator architecture underlying the correlation-sector decomposition of Aschauer et al., shows how a range of witnesses arise naturally from it, and analyzes its tensorial and symmetry structure.
|
||||||
|
|
||||||
|
Das ist aus meiner Sicht exakt das, was das Manuskript tatsächlich leistet.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Meine strategische Empfehlung
|
||||||
|
|
||||||
|
Ich würde **kein zweites Paper** daraus machen.
|
||||||
|
|
||||||
|
Ich würde stattdessen versuchen, dieses Manuskript zu einem **konzeptionellen Paper** zu machen.
|
||||||
|
|
||||||
|
Nicht:
|
||||||
|
|
||||||
|
> "Hier ist ein stärkeres Kriterium."
|
||||||
|
|
||||||
|
Sondern:
|
||||||
|
|
||||||
|
> "Hier ist die richtige geometrische Sprache für eine ganze Familie von Korrelationskriterien."
|
||||||
|
|
||||||
|
Das ist weniger spektakulär, aber wissenschaftlich stabiler. Und paradoxerweise macht genau diese Positionierung die Symmetrie-Section wertvoller: Sie ist dann keine Ablenkung, sondern ein weiterer Blick auf denselben zentralen Gegenstand – die Shadow Map als kanonischen Response-Operator. Ich halte das für die stärkere und langfristig überzeugendere Erzählung.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> Denkst du, dass du mir ein manuelles diff erzeugen kannst, in dem du beschreibst, welche änderungen du wo vorschlägst? Oder ist das zu viel für einen manuellen diff?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ja. Und ich glaube sogar, dass das **die sinnvollste Art** wäre, an diesem Manuskript weiterzuarbeiten.
|
||||||
|
|
||||||
|
Ich würde **keinen automatischen LaTeX-Diff** erzeugen, sondern einen **editorischen Diff**, wie ihn ein guter Co-Autor oder ein Referee schreiben würde.
|
||||||
|
|
||||||
|
Also ungefähr in der Form
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## S. 1, Abstract
|
||||||
|
|
||||||
|
### Derzeit
|
||||||
|
|
||||||
|
> We present ...
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
Hier wird der Eindruck erweckt, der Hauptbeitrag sei ein neues Separabilitätskriterium.
|
||||||
|
|
||||||
|
### Vorschlag
|
||||||
|
|
||||||
|
Den ersten Satz stärker auf die *response-map architecture* fokussieren.
|
||||||
|
|
||||||
|
Danach erst die Witnesses erwähnen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Section 1, erster Absatz
|
||||||
|
|
||||||
|
### Derzeit
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
### Warum ändern?
|
||||||
|
|
||||||
|
Der Leser glaubt nach zwei Seiten immer noch, das Paper gehe um eine neue Trace Norm.
|
||||||
|
|
||||||
|
Ich würde hier schon ankündigen
|
||||||
|
|
||||||
|
> canonical response architecture
|
||||||
|
|
||||||
|
und
|
||||||
|
|
||||||
|
> tensor viewpoint
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Section 4
|
||||||
|
|
||||||
|
Nur kleinere Änderungen.
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Neue Symmetry Section
|
||||||
|
|
||||||
|
Nicht als "another result" ankündigen.
|
||||||
|
|
||||||
|
Sondern
|
||||||
|
|
||||||
|
> structural analysis of the shadow maps.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Section 8
|
||||||
|
|
||||||
|
Diese Section sollte im Abstract und der Einleitung früher angekündigt werden.
|
||||||
|
|
||||||
|
Im Moment kommt sie überraschend.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
usw.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ich würde außerdem jedes Änderungsstück klassifizieren.
|
||||||
|
|
||||||
|
Zum Beispiel
|
||||||
|
|
||||||
|
🟢 **editorial**
|
||||||
|
|
||||||
|
keine Mathematik betroffen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
🟡 **positioning**
|
||||||
|
|
||||||
|
gleiche Mathematik, aber anderer wissenschaftlicher Claim
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
🔴 **substantive**
|
||||||
|
|
||||||
|
hier sollte eventuell wirklich umgeschrieben werden
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Das hätte einen riesigen Vorteil:
|
||||||
|
|
||||||
|
Du kannst entscheiden
|
||||||
|
|
||||||
|
> ja
|
||||||
|
|
||||||
|
> nein
|
||||||
|
|
||||||
|
> später
|
||||||
|
|
||||||
|
ohne dass schon hunderte Zeilen Latex geändert wurden.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ich würde sogar noch einen Schritt weiter gehen.
|
||||||
|
|
||||||
|
Ich würde das Paper nicht linear durchgehen.
|
||||||
|
|
||||||
|
Sondern in drei Durchgängen.
|
||||||
|
|
||||||
|
### Pass 1 – Scientific framing
|
||||||
|
|
||||||
|
Nur
|
||||||
|
|
||||||
|
* Titel
|
||||||
|
* Abstract
|
||||||
|
* Einleitung
|
||||||
|
* Outlook
|
||||||
|
|
||||||
|
Hier entscheidet sich praktisch alles.
|
||||||
|
|
||||||
|
Das sind vielleicht 5 Seiten.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Pass 2 – Storytelling
|
||||||
|
|
||||||
|
Jetzt schauen wir
|
||||||
|
|
||||||
|
* Reihenfolge der Sections
|
||||||
|
* Übergänge
|
||||||
|
* Motivation
|
||||||
|
* warum existiert jede Section?
|
||||||
|
|
||||||
|
Das ist unabhängig von einzelnen Formulierungen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Pass 3 – Mikroebene
|
||||||
|
|
||||||
|
Erst ganz zum Schluss
|
||||||
|
|
||||||
|
* einzelne Sätze
|
||||||
|
* Formulierungen
|
||||||
|
* Notation
|
||||||
|
* Referee-Fallen
|
||||||
|
* sprachliche Glättung
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ehrlich gesagt glaube ich, dass Pass 1 der wichtigste ist.
|
||||||
|
|
||||||
|
Denn nach dem Lesen des ganzen Papers glaube ich inzwischen nicht mehr, dass das Manuskript ein mathematisches Problem hat.
|
||||||
|
|
||||||
|
Ich glaube, es hat ein **Positionierungsproblem**.
|
||||||
|
|
||||||
|
Das ist eine gute Nachricht.
|
||||||
|
|
||||||
|
Mathematik umzubauen ist teuer.
|
||||||
|
|
||||||
|
Die wissenschaftliche Erzählung präziser zu machen, ist vergleichsweise günstig.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ich hätte sogar Lust, das wirklich systematisch zu machen – fast wie ein gemeinsamer Co-Autor. Also nicht nur "hier fehlt ein Komma", sondern ein vollständiger **editorischer Review** mit vielleicht 50–100 nummerierten Änderungsvorschlägen, jeweils mit Begründung ("Warum würde ein Referee hier stolpern?") und einer konkreten Alternative. Nach meiner Erfahrung ist so ein Dokument oft wertvoller als ein fertiger Rewrite, weil man jede Änderung bewusst übernehmen oder verwerfen kann und dabei die Kontrolle über das Manuskript behält.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
> Ich habe die neue section zu symmetrischen zuständen hochgeladen, und eine Diskussion dazu. Was denkst du?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
Ich habe die neue Section und die Diskussion dazu gelesen. Meine Einschätzung deckt sich in den großen Linien mit dem, was in `discussion_symmeries` schon erarbeitet wurde – aber ich würde an ein paar Stellen andere Akzente setzen, und es gibt ein paar technische Punkte, die mir zusätzlich auffallen.
|
||||||
|
|
||||||
|
**Wo ich zustimme**
|
||||||
|
|
||||||
|
Die Kernbeobachtung der vorherigen Diskussion ist richtig: Es gibt zwei *verschiedene* Mechanismen für Singulärwert-Entartung, und keiner der bisherigen Zahlenbeispiele im Paper (GHZ₃, Smolin, die 38 Graphzustände) wird tatsächlich durch die Darstellungstheorie erklärt – sondern durch die Stabilizer-Struktur. Das ist der eigentliche Fund der Section, nicht Proposition 1. Das würde ich auch so sehen und genauso stark hervorheben wie schon vorgeschlagen.
|
||||||
|
|
||||||
|
**Wo ich einen anderen Akzent setzen würde**
|
||||||
|
|
||||||
|
Ich würde noch einen Schritt weiter gehen als die vorherige Diskussion: Wenn *keines* der im Paper verwendeten Beispiele den darstellungstheoretischen Mechanismus tatsächlich braucht (Remark~\ref{rem:no-universal-sharpening} sagt das ja explizit – GHZ₃ und Smolin sind nicht kontinuierlich symmetrisch), dann ist Proposition~\ref{prop:block-diagonal}/\ref{prop:reduced-formula} im Moment eher ein Angebot an hypothetische zukünftige Anwendungen als eine Erklärung von etwas, das im Paper vorkommt. Ich würde überlegen, das Gewicht umzukehren:
|
||||||
|
|
||||||
|
- Den Stabilizer-Mechanismus (Lemma 2, Corollary) nach vorne stellen und als Hauptresultat der Section verkaufen – er erklärt tatsächlich jede numerisch beobachtete Entartung im Paper, exakt und elementar (nur $\mathbb F_2$-Lineare Algebra, kein Schur-Lemma nötig).
|
||||||
|
- Die darstellungstheoretische Konstruktion (Proposition 1/2, Corollary 1) knapper fassen oder sogar in einen Anhang schieben, mit einem Satz wie "falls $\rho$ zusätzlich eine kontinuierliche Kollektivsymmetrie besitzt, gilt zusätzlich…" – als Vollständigkeits-Ergänzung, nicht als tragendes Resultat.
|
||||||
|
|
||||||
|
Das würde auch das von der vorigen Diskussion erwähnte Problem des Niveauwechsels entschärfen: der $\mathbb F_2$-Teil ist konkret und im Duktus des restlichen Papers, der Darstellungstheorie-Teil ist der abstrakte Ausreißer.
|
||||||
|
|
||||||
|
**Technische Punkte, die mir zusätzlich auffallen**
|
||||||
|
|
||||||
|
1. Im Beweis von Lemma~\ref{lem:stabilizer-degeneracy} wird explizit in der "rohen" (nicht orthonormalen) Pauli-String-Basis gerechnet, während Proposition~\ref{prop:block-diagonal} in sektor-adaptierten *orthonormalen* Koordinaten arbeitet. Das ist kein Fehler – Pauli-Strings sind ja bereits orthogonal mit fester Norm $\mathrm{tr}(\sigma_i\sigma_j)=d\,\delta_{ij}$, also unterscheiden sich beide Basen nur durch eine globale Skalierung, die Singulärwerte bleiben davon unberührt bis auf genau den Normierungsfaktor, der am Ende explizit nachgezogen wird. Trotzdem würde ich einen Satz ergänzen, der das explizit sagt, sonst fragt sich ein aufmerksamer Leser, warum hier plötzlich die Basis wechselt.
|
||||||
|
|
||||||
|
2. Die Integrationsnotiz oben ("Requires \label{thm:cut-bound} to be added") ist inzwischen obsolet – sowohl in `symmetric_shadow_maps_formal.tex` als auch in `_formal_2.tex` trägt das Theorem das Label bereits. Die Notiz kann raus.
|
||||||
|
|
||||||
|
3. Label-Kollisionen: Ich habe die Labels der neuen Section (`prop:block-diagonal`, `prop:reduced-formula`, `cor:consistency`, `lem:code-support`, `lem:stabilizer-degeneracy`, `cor:stabilizer-examples`, `rem:no-universal-sharpening`, `rem:two-mechanisms`) gegen die bestehenden Labels im Hauptpaper geprüft – keine Überschneidung, sauber.
|
||||||
|
|
||||||
|
4. Die vorgeschlagene Platzierung (nach Section 8/Tensor-Viewpoint, vor Outlook) finde ich richtig, aber aus einem etwas anderen Grund als "chronologisch danach": die Tensor-Section etabliert erst die Sprache "eine Rang-1-Tatsache, viele lineare Blicke", und die Symmetrie-Section ist genau ein weiterer solcher linearer Blick (Isotypen-Projektion bzw. $\mathbb F_2$-Faserstruktur statt Sektor-Projektion). Das würde ich in der Einleitung der Section auch explizit so anschließen ("this is one further linear lens on the same object"), damit sie sich narrativ unterordnet statt als dritte große Erzählung neben Rang-1-Tensor und Trace-Norm-Kriterium zu stehen.
|
||||||
|
|
||||||
|
Soll ich einen konkreten Umbau-Vorschlag ausformulieren (Stabilizer-Mechanismus vorziehen, Darstellungstheorie-Teil straffen/in Anhang), oder lieber zuerst die Normierungs-Klarstellung in Lemma 2 als kleinen Patch einfügen?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
> Inhaltlich: die Diskussion von diskreten permutations Symmetrien ist schon drin, oder? an kontinuierlichen Symmetrien arbeite ich gerade , dafür wird es auch Beispiele geben.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Gute Frage, und ich glaube, die Antwort ist "teilweise ja, aber nicht in der Form, die man vielleicht erwartet."
|
||||||
|
|
||||||
|
**Was aktuell drin ist:**
|
||||||
|
|
||||||
|
1. **Kontinuierliche Kollektivsymmetrie** (Proposition~\ref{prop:block-diagonal}/\ref{prop:reduced-formula}): $G$ kompakt, wirkt durch $g\mapsto\bigotimes_a U_g^{(a)}$ – also dieselbe lokale Unitary auf jeder Partei gleichzeitig (Kollektivrotation, z.B. $SU(2)$-Twirl). Das ist explizit der kontinuierliche Fall.
|
||||||
|
|
||||||
|
2. **Stabilizer-/Pauli-diagonale Struktur** (Lemma~\ref{lem:stabilizer-degeneracy}): diskret, aber über $\mathbb F_2$-lineare Algebra der Pauli-Strings, nicht über Permutationen von Parteien.
|
||||||
|
|
||||||
|
**Was, glaube ich, tatsächlich fehlt: Permutationssymmetrie von Parteien selbst** ($S_n$ oder eine Untergruppe wirkt durch Vertauschen *welche Partei welche ist*, wie bei Dicke-Zuständen, $W_n$, oder allgemein permutationsinvarianten Zuständen).
|
||||||
|
|
||||||
|
Das ist strukturell etwas anderes als beide bisherigen Mechanismen:
|
||||||
|
|
||||||
|
- Es ist **nicht** der Kollektivsymmetrie-Fall aus Proposition 1, weil dort $g\mapsto\bigotimes_a U_g^{(a)}$ dieselbe Unitary an jeder Partei anwendet – eine Permutation vertauscht dagegen *Tensorfaktoren*, wirkt also als Permutationsdarstellung auf $\bigotimes_{a\in S}\V^{(a)}$, nicht als "diagonale" lokale Unitary-Wirkung. Formal ist $S_n$ zwar auch eine kompakte (sogar endliche) Gruppe, und Schurs Lemma im Beweis von Proposition~\ref{prop:block-diagonal} braucht eigentlich nur $G$-Äquivarianz, keine spezifisch "kollektiv-unitäre" Form – der Beweis würde also mit $G=S_n$ als Permutationsdarstellung mutatis mutandis durchgehen. Aber die Formulierung, das Setup und die Beispiele im Text sind aktuell alle auf den Kollektivrotations-Fall zugeschnitten.
|
||||||
|
- Es ist **auch nicht** der Stabilizer-Mechanismus, der über Pauli-String-Support arbeitet und mit Permutationsinvarianz der Parteien nichts zu tun hat (auch nicht-permutationsinvariante Stabilizer-Zustände wie der Line-Graph fallen darunter, während umgekehrt manche permutationsinvarianten Zustände wie Dicke-Zustände gar nicht Pauli-diagonal/Stabilizer sind).
|
||||||
|
|
||||||
|
**Konkret fehlt also:** ein dritter Abschnitt (oder eine Erweiterung von Proposition 1 auf explizit permutationsinvariante $\rho$), der zeigt, dass für $S$-intern permutationsinvariante Zustände die Blockstruktur nach *Young-Tableaux/irreduziblen $S_{|S|}$-Darstellungen* zerfällt statt nach Isotypen einer Lie-Gruppe – mit Dicke- oder $W_n$-artigen Zuständen als Beispiel. Das wäre technisch am ehesten eine Variante von Proposition~\ref{prop:block-diagonal} mit $G=S_{|S|}$ (bzw. $S_{|S|}\times S_{|S^c|}$, falls beide Seiten intern symmetrisch sind) statt eines Lie-Gruppen-$G$, und bräuchte eigene Beispielrechnungen (Dicke-Zustände wären der naheliegende Kandidat, weil sie im Gegensatz zu GHZ/Graphzuständen *nicht* Pauli-diagonal sind und daher den Stabilizer-Mechanismus nicht nutzen können – dort müsste die Entartung tatsächlich aus der Permutationsstruktur kommen, nicht aus der $\mathbb F_2$-Fasertheorie).
|
||||||
|
|
||||||
|
Falls das die Richtung ist, an der du gerade arbeitest: macht das Sinn als dritter Mechanismus, oder hattest du Permutationssymmetrie eigentlich als Spezialfall von "kontinuierlich" im Kopf (z.B. weil $W_n$/Dicke-Zustände oft zusätzlich auch unter einer kontinuierlichen Untergruppe invariant sind)?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
> Ich wollte zeigen, dass die verschiedensten Symmetrien funktionieren...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Verstanden — dann ist das Ziel im Grunde eine dritte, saubere Säule neben den beiden vorhandenen: "hier ist ein generisches Werkzeug (Prop. 1/2), und es funktioniert für ganz verschiedene Symmetrietypen, mit jeweils eigenen Beispielen." Das ist eine stärkere Aussage als das, was aktuell dasteht, und würde auch die Kritik aus `discussion_symmeries` entschärfen ("zwei konkurrierende Erzählungen") — es wird dann klar eine Erzählung: *ein* Werkzeug (Schur/Äquivarianz), viele Instanzen.
|
||||||
|
|
||||||
|
Damit das trägt, würde ich den Symmetrie-Abschnitt ungefähr so umbauen:
|
||||||
|
|
||||||
|
**1. Proposition~\ref{prop:block-diagonal} bleibt der generische Kern**, aber sauber $G$-agnostisch formuliert. Sie ist schon fast dort — der Beweis braucht nur $G$-Äquivarianz von $\widetilde{\mathcal M}_S(\rho)$, egal ob $G$ durch Kollektivrotation, durch Permutation der Parteien in $S$, oder durch eine ganz andere kompakte Gruppe wirkt. Ich würde das im Text explizit machen (aktuell suggeriert die Formulierung "$g\mapsto\bigotimes_a U_g^{(a)}$" stillschweigend nur den Kollektivrotationsfall).
|
||||||
|
|
||||||
|
**2. Dann pro Symmetrietyp ein eigener kurzer Unterabschnitt**, mit demselben Muster: Gruppe → Isotypenzerlegung → Beispielzustand → explizite Singulärwerte.
|
||||||
|
|
||||||
|
- *Kollektivrotation* (schon da): $SU(2)$-Twirl, Proposition 2 mit den $r_\lambda,v_\lambda$.
|
||||||
|
- *Permutationssymmetrie*: $G=S_{|S|}$ (bzw. $S_{|S|}\times S_{|S^c|}$) wirkt durch Vertauschen der Tensorfaktoren, Isotypen = Young-Tableaux/Specht-Module. Dicke-Zustände sind der naheliegende Testfall, gerade weil sie *nicht* Pauli-diagonal sind — die Entartung dort kann also nicht vom Stabilizer-Mechanismus kommen, sondern muss (falls vorhanden) aus der Permutationsstruktur stammen. Das wäre ein sauberer Beleg, dass die beiden Mechanismen wirklich unabhängig sind, nicht nur behauptet.
|
||||||
|
- *Stabilizer/diskret* (schon da als Lemma 2, eigener Mechanismus, kein Spezialfall von Prop. 1).
|
||||||
|
|
||||||
|
**3. Der "zwei komplementäre Mechanismen"-Remark wird dann zu "mehrere komplementäre Mechanismen"**, mit einer Tabelle: Symmetrietyp → welche Prop./Lemma greift → welches Beispiel im Paper es zeigt → ob Pauli-diagonal oder nicht. Das macht die Pointe noch schärfer als jetzt: es gibt Zustände, die unter genau einem Mechanismus entarten, und die Tabelle zeigt sofort, welcher.
|
||||||
|
|
||||||
|
Bevor ich dir konkret bei der Permutations-Rechnung helfe (Dicke-Zustand, Blockstruktur von $\mathcal M_S$ unter $S_n$): Hast du schon einen bestimmten Zustand/Cut im Kopf, an dem du das durchrechnen willst, oder soll ich einen Vorschlag machen (z.B. Dicke-Zustand $|D_n^k\rangle$ mit $S=\{1\}$ oder $S=\{1,2\}$, analog zum GHZ₃-Beispiel)?
|
||||||
|
|
||||||
|
|
||||||
0
agent_discussions/2026-07-12_20_claude_fritzchen.md
Normal file
0
agent_discussions/2026-07-12_20_claude_fritzchen.md
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
Hier ist der Ersatztext für Remark~\ref{rem:no-universal-sharpening}s SU(2)-Passage — als eigenständiges Lemma mit Beweis, in eurem Stil, direkt einsetzbar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
\subsection*{Exact degeneracy from stabilizer structure (replaces the SU(2) mechanism)}
|
||||||
|
|
||||||
|
The degeneracies recorded for $\GHZ_3$, the Smolin state, and all $38$ four-qubit graph states share no continuous symmetry — collective $SU(2)$, plain or twisted, is numerically excluded for both example states. Their common origin is instead a discrete, combinatorial fact about \emph{Pauli-diagonal} states, requiring only elementary group theory over $\mathbb F_2$.
|
||||||
|
|
||||||
|
\paragraph{Setup.} Identify each single-party Pauli index with $\mathbb F_2^2$ via $I\mapsto(0,0)$, $X\mapsto(1,0)$, $Y\mapsto(1,1)$, $Z\mapsto(0,1)$, so that an $n$-party Pauli string $\sigma_{\vec i}$ corresponds to $\vec i\in\mathbb F_2^{2n}$, and string multiplication (up to phase) becomes addition. Let $H\le\mathbb F_2^{2n}$ be an isotropic subgroup (i.e.\ its elements pairwise commute as operators) not containing $-I$, and let
|
||||||
|
\[
|
||||||
|
\rho_H \;=\; \frac{\Pi_H}{\operatorname{rank}\Pi_H}, \qquad \Pi_H=\frac{1}{|H|}\sum_{h\in H} h,
|
||||||
|
\]
|
||||||
|
the maximally mixed state on the joint $+1$-eigenspace of $H$ (a stabilizer code state; $\rho_H$ is pure iff $|H|=2^n$).
|
||||||
|
|
||||||
|
\begin{lemma}[Support of a stabilizer-code state]
|
||||||
|
\label{lem:code-support}
|
||||||
|
$\operatorname{Tr}[\rho_H\,\sigma_{\vec i}] = \mathbb 1[\vec i\in H]$ for every $\vec i\in\mathbb F_2^{2n}$.
|
||||||
|
\end{lemma}
|
||||||
|
\begin{proof}
|
||||||
|
For $\vec i\in H$: $\Pi_H\sigma_{\vec i}=\Pi_H$ since $h\Pi_H=\Pi_H$ for every $h\in H$, so $\operatorname{Tr}[\Pi_H\sigma_{\vec i}]=\operatorname{Tr}[\Pi_H]=\operatorname{rank}\Pi_H$, giving $\operatorname{Tr}[\rho_H\sigma_{\vec i}]=1$. For $\vec i\notin H$: either $\sigma_{\vec i}$ anticommutes with some $h\in H$, whence $\operatorname{Tr}[\Pi_H\sigma_{\vec i}]=\operatorname{Tr}[h\Pi_H\sigma_{\vec i}]=-\operatorname{Tr}[\Pi_H\sigma_{\vec i}h]=-\operatorname{Tr}[\Pi_H\sigma_{\vec i}]$ (using $h\Pi_H=\Pi_H$ and cyclicity), forcing it to vanish; or $\sigma_{\vec i}$ commutes with all of $H$ without belonging to it (a logical operator), in which case it acts as a nonzero-weight, traceless operator on the logical subspace on which $\rho_H$ restricts to a multiple of the identity, again giving zero.
|
||||||
|
\end{proof}
|
||||||
|
|
||||||
|
\begin{lemma}[Forced degeneracy of $\widetilde{\mathcal M}_S(\rho_H)$]
|
||||||
|
\label{lem:stabilizer-degeneracy}
|
||||||
|
Let $S\mid S^c$ be a cut and let $\varphi:H\to\mathbb F_2^{2|S|}$, $\psi:H\to\mathbb F_2^{2|S^c|}$ be the two restriction homomorphisms, so that $H\hookrightarrow \mathbb F_2^{2|S|}\times\mathbb F_2^{2|S^c|}$ via $h\mapsto(\varphi(h),\psi(h))$. If $\psi$ is injective, then every nonzero row of $\widetilde{\mathcal M}_S(\rho_H)$ has exactly $|\ker\varphi|$ nonzero entries, all of magnitude $1$, with pairwise disjoint column supports across distinct rows; consequently
|
||||||
|
\[
|
||||||
|
\widetilde{\mathcal M}_S(\rho_H) \text{ has exactly } |\operatorname{im}\varphi|-1 \text{ equal nonzero singular values, each } =\sqrt{|\ker\varphi|}.
|
||||||
|
\]
|
||||||
|
(Normalization: this is in the orthonormal-Pauli convention $e_i=\sigma_i/\sqrt2$ per party; divide by $2^{n/2}$ for the convention used elsewhere in this note.)
|
||||||
|
\end{lemma}
|
||||||
|
\begin{proof}
|
||||||
|
By Lemma~\ref{lem:code-support}, the entry of $\widetilde{\mathcal M}_S(\rho_H)$ at row $\vec j\in\mathbb F_2^{2|S|}\setminus\{0\}$, column $\vec k$, is $1$ if $(\vec j,\vec k)\in H$ and $0$ otherwise. For fixed $\vec j\in\operatorname{im}\varphi$, the set $\{\vec k:(\vec j,\vec k)\in H\}$ is a coset of $\ker\varphi$ under the group structure of $H$ (standard fiber property of a homomorphism), hence has size $|\ker\varphi|$, giving the row weight and (since all entries are $\pm1$ in magnitude by Lemma~\ref{lem:code-support}) equal row norm $\sqrt{|\ker\varphi|}$ for every nonzero row. If rows for $\vec j\neq\vec j'$ shared a nonzero column $\vec k$, then $(\vec j,\vec k),(\vec j',\vec k)\in H$ would give $(\vec j-\vec j',0)\in H$ with $\vec j\neq\vec j'$, i.e.\ a nontrivial element of $\ker\psi$ — excluded by injectivity of $\psi$. Rows are thus pairwise orthogonal with equal norm, hence (after normalizing) already the right singular vectors, and the singular values are all equal to the common row norm.
|
||||||
|
\end{proof}
|
||||||
|
|
||||||
|
\begin{corollary}
|
||||||
|
The Lemma applies uniformly to: pure stabilizer states ($|H|=2^n$, including all graph states and $\GHZ_n$), and uniform mixtures over a stabilizer code space with $|H|<2^n$ (including the Smolin state, $H=\{IIII,XXXX,YYYY,ZZZZ\}$). Injectivity of $\psi$ holds automatically whenever $H$ contains no element supported entirely on $S$ — checkable by inspection of the generators, without any Lie-group input. For $\GHZ_3$, $S=\{1\}$: $|\ker\varphi|=2$, giving $3$ singular values equal to $\sqrt2/2^{3/2}=0.5$. For the Smolin state, every $1\mid3$ and $2\mid2$ cut: $\varphi$ is bijective ($|\ker\varphi|=1$), giving $4$ singular values equal to $1/2^{2}=0.25$ — identical across all four inequivalent cuts, since bijectivity of $\varphi$ holds for \emph{any} nonempty proper subset $S$ of the four legs given this particular $H$.
|
||||||
|
\end{corollary}
|
||||||
|
|
||||||
|
\begin{remark}
|
||||||
|
The $y$-parity grading noted above is the special case $H=\{I^{\otimes n}\}$ acting trivially — more precisely, it is not itself an instance of this Lemma but a compatible, coarser $\mathbb Z_2$-grading that commutes with any $H$-decomposition and can be applied on top of it without modification.
|
||||||
|
\end{remark}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Zwei Anmerkungen zur Einordnung, falls ihr das einbaut:
|
||||||
|
|
||||||
|
1. Die Bedingung "$\psi$ injektiv" ist die einzige Voraussetzung, die pro Anwendungsfall geprüft werden muss — bei $n$ Erzeugern ist das eine einfache lineare-Algebra-Prüfung über $\mathbb F_2$, keine Handarbeit.
|
||||||
|
2. Das Lemma sagt nichts über Zustände, die *nicht* Pauli-diagonal sind (unser generisches $S_3$-Beispiel von vorhin) — dort bleibt nur Proposition 1 (Trägerreduktion via Schur), ohne erzwungene Gleichheit. Die beiden Mechanismen sind komplementär, nicht konkurrierend, und das solltet ihr explizit so benennen, damit klar ist, wann welcher greift.
|
||||||
631
companion/symmetric_shadow_maps_companion.tex
Normal file
631
companion/symmetric_shadow_maps_companion.tex
Normal file
|
|
@ -0,0 +1,631 @@
|
||||||
|
\documentclass[11pt]{article}
|
||||||
|
|
||||||
|
\usepackage[a4paper,margin=1in]{geometry}
|
||||||
|
\usepackage[T1]{fontenc}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage{lmodern}
|
||||||
|
\usepackage{amsmath,amssymb,amsthm,mathtools}
|
||||||
|
\usepackage{booktabs}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\usepackage{hyperref}
|
||||||
|
\usepackage{bbm}
|
||||||
|
|
||||||
|
\newtheorem{remark}{Remark}
|
||||||
|
|
||||||
|
\newcommand{\tr}{\operatorname{tr}}
|
||||||
|
\newcommand{\id}{\mathbbm{1}}
|
||||||
|
\newcommand{\R}{\mathbb{R}}
|
||||||
|
\newcommand{\V}{\mathcal{V}}
|
||||||
|
\newcommand{\norm}[1]{\left\lVert #1 \right\rVert}
|
||||||
|
\newcommand{\fro}{\mathrm{F}}
|
||||||
|
\newcommand{\GHZ}{\mathrm{GHZ}}
|
||||||
|
|
||||||
|
\title{Companion Note on Symmetric Shadow Maps}
|
||||||
|
\author{Draft companion note}
|
||||||
|
\date{May 2026}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\maketitle
|
||||||
|
|
||||||
|
\begin{abstract}
|
||||||
|
This companion note explains the idea behind the symmetric shadow-map criterion in a self-contained way for readers who know, or at least want a quick reminder of, the older local-invariant correlation-sector approach of Aschauer, Calsamiglia, Hein, and Briegel \cite{aschauer}. The main message is simple. The original correlation strengths $L_S$ record only the total quadratic size of each correlation block. The geometric object that was implicit all along is richer: for a chosen source subsystem, one can look at the family of correlation-response vectors induced on the other side. In the multipartite case a single source party casts several such shadows at once, one into each orthogonal correlation sector on the complement. Stacking them produces a direct-sum response operator and its associated response ellipsoid in correlation space. For cut-product states that ellipsoid must collapse to a line; entanglement is witnessed by the failure of that locking. We also explain, in the same informal register, why nothing about this argument is special to a single-party source, why tracing out an unwanted party is a slice of the correlation data rather than a loss of it, and why every construction in the note is best pictured as one flattening of a single underlying correlation cube.
|
||||||
|
\end{abstract}
|
||||||
|
|
||||||
|
\section{Why another note?}
|
||||||
|
|
||||||
|
The formal note states the result in a compressed form. Fix a source party $a$, define the combined shadow map $\mathcal M_a(\rho)$ --- that is, the direct-sum response operator obtained by stacking all one-vs-rest response maps --- and prove that
|
||||||
|
\begin{equation}
|
||||||
|
\norm{\mathcal M_a(\rho)}_*\le 1
|
||||||
|
\end{equation}
|
||||||
|
for states separable across $a\mid\bar a$, and then average or maximize over $a$ to obtain permutation-symmetric criteria.
|
||||||
|
|
||||||
|
That is the right final statement, but it hides the route by which the construction becomes natural. The purpose of the present note is to reconstruct that route while assuming only familiarity with the older sector-wise quantities
|
||||||
|
\begin{equation}
|
||||||
|
L_S(\rho)=\norm{C_S(\rho)}_{\fro}^2
|
||||||
|
\end{equation}
|
||||||
|
from the Aschauer \emph{et al.} framework \cite{aschauer}.
|
||||||
|
|
||||||
|
The conceptual progression is:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Start from the old quadratic invariants $L_S$.
|
||||||
|
\item Notice that they throw away too much directional information.
|
||||||
|
\item Replace a single number by a linear response map.
|
||||||
|
\item Interpret that map geometrically as an ellipsoid in correlation space.
|
||||||
|
\item Observe that in the multipartite case one source party produces several such shadows simultaneously, landing in orthogonal sectors.
|
||||||
|
\item Stack those shadows and test whether they remain controlled by one common scalar factor.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
The last step is the origin of the symmetric shadow-map criterion.
|
||||||
|
|
||||||
|
There is also a practical reason for spelling the story out this way. The existing correlation-tensor literature is already rich: there are criteria based on full tensors, unfoldings, augmented Bloch tensors, scalar sums over sectors, and even partition-adapted mixed-order block trace norms. So the point of the present construction is not to claim the first criterion of that broad type. The narrower claim is that once a source party $a$ is fixed, one can organize the data canonically by including every nonempty target subset $T\subseteq \bar a$ in one exhaustive direct sum. That source-indexed architecture is the feature to keep in mind when comparing with prior work.
|
||||||
|
|
||||||
|
To be completely explicit, the closest prior-art families include bipartite correlation-matrix criteria \cite{devicente,chenwu}, multipartite full-tensor unfoldings and matricizations \cite{hassanjoag,devicentehuber,li2014,jingzhang2023}, nonlinear geometric tensor criteria \cite{laskowski2011}, scalar multi-sector norm criteria \cite{klocklhuber2015}, and recent augmented or partition-adapted mixed-order block criteria \cite{shen2016,sarbicki2020,zhao2020,huang2024extended,liyaoyangfei2025}. In that company, the honest claim here is modest: the novelty is mainly in the canonical source-indexed organization of the response data, not in being the first multipartite trace-norm criterion in the Bloch-tensor world.
|
||||||
|
|
||||||
|
There is also a small historical point worth keeping straight. Aschauer \emph{et al.} \cite{aschauer} should be read as an early multipartite criterion based on local-operator expansion coefficients, or equivalently on correlation tensors organized by support sectors. The later Hassan--Joag paper \cite{hassanjoag} marks a different milestone: an explicit multipartite separability criterion framed in Bloch-representation language and based on full-tensor unfoldings. The shadow-map construction sits between those viewpoints: it keeps the older sector decomposition but restores directional information inside and across the sectors.
|
||||||
|
|
||||||
|
\section{What was already present in the Aschauer \emph{et al.} framework}
|
||||||
|
|
||||||
|
The local-invariant correlation-sector decomposition of Aschauer \emph{et al.} \cite{aschauer} organizes an $n$-qubit state into correlation sectors indexed by subsets $S\subseteq P$. For each nonempty $S$, the tensor $C_S(\rho)$ collects the Pauli correlations with support exactly on $S$, and the scalar
|
||||||
|
\begin{equation}
|
||||||
|
L_S(\rho)=\norm{C_S(\rho)}_{\fro}^2
|
||||||
|
\end{equation}
|
||||||
|
measures the squared Euclidean size of that block.
|
||||||
|
|
||||||
|
This had two major strengths.
|
||||||
|
\begin{itemize}
|
||||||
|
\item It was local-unitary invariant.
|
||||||
|
\item It admitted a simple convexity argument: for qubits, product states have $L_S=1$, so $L_S>1$ certifies entanglement.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
But the compression is severe. Once a whole tensor block has been replaced by one Frobenius norm, the geometry of that block is lost. Two states can have the same $L_S$ although one correlation block is essentially rank one while another is spread across several orthogonal directions.
|
||||||
|
|
||||||
|
That is the real motivation for the new construction. The issue is not that this older sector-decomposition paper had the wrong geometry; it is that the geometry was compressed too aggressively.
|
||||||
|
|
||||||
|
\section{The basic ellipsoid: response vectors rather than states}
|
||||||
|
|
||||||
|
Take first the bipartite two-qubit case. Write the correlation matrix as
|
||||||
|
\begin{equation}
|
||||||
|
C_{ij}=\tr\!\bigl(\rho\,\sigma_i\otimes\sigma_j\bigr),
|
||||||
|
\qquad i,j\in\{x,y,z\}.
|
||||||
|
\end{equation}
|
||||||
|
Pick a unit vector $u=(u_x,u_y,u_z)\in\R^3$ on the second qubit and form the traceless observable
|
||||||
|
\begin{equation}
|
||||||
|
\sigma_u=u_xX+u_yY+u_zZ.
|
||||||
|
\label{eq:sigma-u-def}
|
||||||
|
\end{equation}
|
||||||
|
Then the induced vector on the first qubit is
|
||||||
|
\begin{equation}
|
||||||
|
r(u)=Cu,
|
||||||
|
\end{equation}
|
||||||
|
with components
|
||||||
|
\begin{equation}
|
||||||
|
r_i(u)=\sum_j C_{ij}u_j=\tr\!\bigl(\rho\,\sigma_i\otimes\sigma_u\bigr).
|
||||||
|
\label{eq:ri}
|
||||||
|
\end{equation}
|
||||||
|
|
||||||
|
This vector $r(u)$ is not the post-measurement state of the first qubit. It is the list of correlation coefficients obtained when the second qubit is probed in direction $u$. It is therefore better thought of as a \emph{correlation-response vector}.
|
||||||
|
|
||||||
|
This matters conceptually. The ellipsoid under discussion is not a steering ellipsoid in state space. It lives in correlation space. One chooses a direction on one side, computes the induced correlation vector on the other, and collects all such vectors. The image of the unit ball under the linear map $u\mapsto Cu$ is then an ellipsoid in $\R^3$.
|
||||||
|
|
||||||
|
Its semiaxes are the singular values of $C$. So the singular-value language is not an algebraic add-on. It is simply the natural language of the response ellipsoid.
|
||||||
|
|
||||||
|
It is worth being precise about what the different natural norms of this ellipsoid measure, since it is easy to blur them together. Write $s_1,s_2,s_3\ge0$ for the semiaxis lengths, i.e.\ the singular values of $C$. The \emph{volume} of the ellipsoid is proportional to the product $s_1s_2s_3$; that is what a determinant measures, and it is a poor witness here because it vanishes the moment even one semiaxis is zero, no matter how large the other two are. The \emph{Frobenius norm squared}, $s_1^2+s_2^2+s_3^2$, is the sum of the squared semiaxes; this is the old $L_S$ in disguise, and it treats one long axis and three balanced medium axes as interchangeable whenever their total squared length agrees. The \emph{nuclear norm}, $s_1+s_2+s_3$, is the plain sum of the semiaxis lengths, with no squaring and no vanishing on account of a single small or absent axis. It behaves like a perimeter of the ellipsoid's principal directions rather than its volume or its squared size, and that additive, non-vanishing character is exactly what makes it the right quantity for the cut-separable bound: every independent response direction contributes to it in proportion to its own length, never more and never less, and never at the mercy of some other direction happening to vanish.
|
||||||
|
|
||||||
|
\section{What a response vector actually measures: conditioning on an outcome}
|
||||||
|
\label{sec:conditioning}
|
||||||
|
|
||||||
|
The response vector $r(u)$ has a completely concrete operational meaning, and it is worth spelling out, because it explains \emph{why} product states collapse to a line before we even reach that argument in coordinate form.
|
||||||
|
|
||||||
|
Write the observable $\sigma_u=u_xX+u_yY+u_zZ$ from Eq.~\eqref{eq:sigma-u-def} in spectral form,
|
||||||
|
\begin{equation}
|
||||||
|
\sigma_u=P_+-P_-,
|
||||||
|
\end{equation}
|
||||||
|
where $P_\pm$ projects onto the $\pm1$-eigenspace of $\sigma_u$ on the second qubit. Measuring the second qubit along direction $u$ produces outcome $s=\pm1$ with probability
|
||||||
|
\begin{equation}
|
||||||
|
p_s=\tr\bigl[(\id\otimes P_s)\rho\bigr],
|
||||||
|
\end{equation}
|
||||||
|
and leaves the first qubit in the conditional state
|
||||||
|
\begin{equation}
|
||||||
|
\rho_s=\frac{\tr_2\bigl[(\id\otimes P_s)\rho\bigr]}{p_s},
|
||||||
|
\qquad s=\pm1,
|
||||||
|
\end{equation}
|
||||||
|
with Bloch vector $a_s\in\R^3$. A short calculation using Eq.~\eqref{eq:ri} gives
|
||||||
|
\begin{equation}
|
||||||
|
r(u)=p_+a_+-p_-a_-.
|
||||||
|
\label{eq:conditioning}
|
||||||
|
\end{equation}
|
||||||
|
In words, $r(u)$ is the probability-weighted difference between the two states the first qubit can be left in, depending on which outcome the measurement on the second qubit produced. If the two possible outcomes never leave the first qubit in different states, $r(u)$ vanishes no matter how sharp that measurement is; if they leave it in very different states, $r(u)$ is correspondingly large. This is a steering-flavored statement without any of steering's usual signalling caveats: nothing physically happens to the first qubit, and $r(u)$ is simply bookkeeping the correlation between the possible outcomes on one side and the possible conditional states on the other.
|
||||||
|
|
||||||
|
Eq.~\eqref{eq:conditioning} immediately explains the product-state collapse of the next section. If $\rho=\rho_1\otimes\rho_2$, learning the outcome on the second qubit carries no information about the first: $\rho_+=\rho_-=\rho_1$ for every direction $u$, so $a_+=a_-=a$ and
|
||||||
|
\begin{equation}
|
||||||
|
r(u)=(p_+-p_-)\,a=\langle\sigma_u\rangle\,a.
|
||||||
|
\end{equation}
|
||||||
|
The response vector always points along the same fixed direction $a$, the Bloch vector of $\rho_1$; only its length changes as $u$ varies. Genuine entanglement across the cut is precisely the failure of this locking: different measurement directions $u$ on the second qubit can then leave the first qubit in genuinely different conditional states, and the response vector sweeps out more than one dimension as $u$ varies.
|
||||||
|
|
||||||
|
For a $d$-dimensional qudit in place of a qubit, the same argument runs with a spectral decomposition into more than two outcomes. Writing $\sigma_u=\sum_k\lambda_kP_k$ for the (now $u$-dependent) eigenbasis of the generic observable $\sigma_u$, with outcome probabilities $p_k$ and conditional Bloch vectors $a_k$, Eq.~\eqref{eq:conditioning} generalizes to an eigenvalue-weighted sum over conditional states rather than a plain difference of two,
|
||||||
|
\begin{equation}
|
||||||
|
r(u)=\sum_k\lambda_k\,p_k\,a_k.
|
||||||
|
\end{equation}
|
||||||
|
The product-state argument goes through exactly as before: if the outcome tells you nothing about the other side, every $a_k$ coincides with the fixed Bloch vector of the marginal, and the sum collapses to $\langle\sigma_u\rangle$ times that one fixed vector.
|
||||||
|
|
||||||
|
The same reading applies unchanged to the multipartite target-sector maps $M_{a\to T}$ of the formal note: $M_{a\to T}(u)$ is the eigenvalue-weighted sum of the sector-$T$ correlation vectors of the conditional states of the complement, exactly as above but with the single second qubit replaced by the full multi-party target sector $T$.
|
||||||
|
|
||||||
|
\section{Why product states collapse to a line}
|
||||||
|
\label{sec:collapse-to-line}
|
||||||
|
|
||||||
|
In the conditioning language of the previous section, the calculation below is the same statement written out in coordinates: measuring qubit $2$ changes nothing about what one can say about qubit $1$.
|
||||||
|
|
||||||
|
Suppose now that
|
||||||
|
\begin{equation}
|
||||||
|
\rho=\rho_A\otimes\rho_B,
|
||||||
|
\end{equation}
|
||||||
|
with local Bloch vectors $a,b\in\R^3$. Then the correlation matrix factorizes as
|
||||||
|
\begin{equation}
|
||||||
|
C=ab^T.
|
||||||
|
\end{equation}
|
||||||
|
Hence
|
||||||
|
\begin{equation}
|
||||||
|
r(u)=Cu=a\,(b\cdot u).
|
||||||
|
\end{equation}
|
||||||
|
Every response vector is parallel to the same fixed vector $a$; only the scalar coefficient changes. Geometrically, the ellipsoid degenerates to a line segment.
|
||||||
|
|
||||||
|
This is the cleanest geometric reading of product structure. Product states have only one correlation channel across the cut. The old Frobenius norm sees only the total squared size of that channel. The singular values also see whether there is only one such direction or several independent ones.
|
||||||
|
|
||||||
|
That is why the nuclear norm is a stronger refinement. A matrix with one singular value $\sqrt3$ and a matrix with three singular values $1,1,1$ have the same Frobenius norm squared $3$, but they describe very different ellipsoids: one long axis in the first case, three orthogonal axes in the second.
|
||||||
|
|
||||||
|
\section{Why the multipartite extension is almost forced}
|
||||||
|
|
||||||
|
Once one thinks in terms of response ellipsoids, the multipartite continuation is hard to avoid.
|
||||||
|
|
||||||
|
Take three qubits $A,B,C$. If one probes qubit $A$ in a direction $u_A$, then three different responses arise naturally:
|
||||||
|
\begin{equation}
|
||||||
|
r_B(u_A)\in\R^3,
|
||||||
|
\qquad
|
||||||
|
r_C(u_A)\in\R^3,
|
||||||
|
\qquad
|
||||||
|
R_{BC}(u_A)\in\R^9.
|
||||||
|
\end{equation}
|
||||||
|
These belong to the $AB$, $AC$, and $ABC$ correlation sectors.
|
||||||
|
|
||||||
|
The key observation is that these target spaces are orthogonal Hilbert-Schmidt sectors. So there is no compelling reason to study them separately. The first way we wrote this down was as the external direct sum
|
||||||
|
\begin{equation}
|
||||||
|
\mathcal R_A(u_A)
|
||||||
|
=
|
||||||
|
\frac{1}{\sqrt3}\bigl(r_B(u_A),r_C(u_A),R_{BC}(u_A)\bigr)
|
||||||
|
\in
|
||||||
|
\R^3\oplus\R^3\oplus\R^9.
|
||||||
|
\end{equation}
|
||||||
|
Its image of the unit ball is one combined ellipsoid.
|
||||||
|
|
||||||
|
This is the decisive step. The old bipartite ellipsoid was not the endpoint of the story; it was the simplest case of a more general response geometry. In the multipartite case one source party casts several shadows at once, one into each orthogonal sector on the complement. At first this looks like a useful stacking trick. But there is actually a cleaner way to understand it.
|
||||||
|
|
||||||
|
For each party $b$, let $\V^{(b)}$ be the real Hilbert-Schmidt space of Hermitian operators on $\mathcal H^{(b)}$, and let $\V_0^{(b)}$ be its traceless subspace, spanned by the generators $\sigma_1^{(b)},\dots,\sigma_{d_b^2-1}^{(b)}$. Then on the complement of $a$ one has the orthogonal decomposition
|
||||||
|
\begin{equation}
|
||||||
|
\V_0^{(\bar a)}
|
||||||
|
=
|
||||||
|
\bigoplus_{\emptyset\neq T\subseteq \bar a}^{\perp}\V_T^{(\bar a)},
|
||||||
|
\end{equation}
|
||||||
|
where $\V_T^{(\bar a)}$ is the span of product basis elements that act nontrivially exactly on the parties in $T$. This is exactly the same kind of invariant-sector decomposition used in the older Aschauer \emph{et al.} picture, now viewed as the codomain decomposition of a response map. So the external direct sum above is just the coordinate form of an internal orthogonal decomposition of the traceless complement space.
|
||||||
|
|
||||||
|
In that language the real primary object is the basis-free response operator
|
||||||
|
\begin{equation}
|
||||||
|
\widetilde{\mathcal M}_a(\rho):\V_0^{(a)}\to \V_0^{(\bar a)},
|
||||||
|
\qquad
|
||||||
|
\langle Y,\widetilde{\mathcal M}_a(\rho)X\rangle
|
||||||
|
=
|
||||||
|
\tr\!\bigl(\rho(X\otimes Y)\bigr).
|
||||||
|
\end{equation}
|
||||||
|
The sector maps are simply its orthogonal projections onto the subspaces $\V_T^{(\bar a)}$. So the combined shadow map is not really a bookkeeping stack after all. It is the full one-vs-rest response operator, written in the orthogonal sector decomposition naturally supplied by the multipartite Bloch space.
|
||||||
|
|
||||||
|
This re-interpretation is useful, not just prettier. It explains from the beginning why the target sectors are orthogonal, why Frobenius additivity is just Pythagoras in the codomain, and why collective unitaries on the complement act by orthogonal rotations on the full target space while generally mixing the individual sectors.
|
||||||
|
|
||||||
|
For general $n$, choosing a source party $a$ and writing $\bar a=P\setminus\{a\}$, every nonempty subset $T\subseteq\bar a$ gives a map
|
||||||
|
\begin{equation}
|
||||||
|
M_{a\to T}(\rho):\R^3\to\R^{3^{|T|}}.
|
||||||
|
\end{equation}
|
||||||
|
Stacking all of them yields the combined shadow map
|
||||||
|
\begin{equation}
|
||||||
|
\mathcal M_a(\rho)
|
||||||
|
=
|
||||||
|
\frac{1}{\sqrt{2^{n-1}-1}}
|
||||||
|
\bigoplus_{\emptyset\neq T\subseteq\bar a}M_{a\to T}(\rho).
|
||||||
|
\end{equation}
|
||||||
|
That is the coordinate object used in the formal note. But the more intrinsic viewpoint is that the codomain has one natural ambient Bloch structure first, and the direct sum appears because that ambient space splits orthogonally by support sectors.
|
||||||
|
|
||||||
|
\section{What cut separability means geometrically}
|
||||||
|
|
||||||
|
To see the geometry, begin with a state that is product across the
|
||||||
|
one-vs-rest cut:
|
||||||
|
\begin{equation}
|
||||||
|
\rho=\rho_A\otimes\sigma_{BC}.
|
||||||
|
\end{equation}
|
||||||
|
Let $a$ be the Bloch vector of $\rho_A$, and let $b,c,T_{BC}$ denote the one- and two-body correlation data of $\sigma_{BC}$. Then each shadow is driven by the same scalar $a\cdot u_A$:
|
||||||
|
\begin{equation}
|
||||||
|
r_B(u_A)=(a\cdot u_A)b,
|
||||||
|
\qquad
|
||||||
|
r_C(u_A)=(a\cdot u_A)c,
|
||||||
|
\qquad
|
||||||
|
R_{BC}(u_A)=(a\cdot u_A)T_{BC}.
|
||||||
|
\end{equation}
|
||||||
|
Thus
|
||||||
|
\begin{equation}
|
||||||
|
\mathcal R_A(u_A)=\frac{a\cdot u_A}{\sqrt3}(b,c,T_{BC}).
|
||||||
|
\end{equation}
|
||||||
|
|
||||||
|
This is the geometric core of the theorem. Even though the response occupies several different sectors, they are all locked to one common source factor. The combined ellipsoid therefore still collapses to a line segment.
|
||||||
|
|
||||||
|
So cut-product structure does not merely bound each sector separately. It imposes a common rank-one organization across \emph{all} sectors at once. That is precisely what separate scalar criteria forget and what the combined shadow map retains.
|
||||||
|
|
||||||
|
For mixed states separable across the same cut, convexity preserves the corresponding nuclear-norm bound.
|
||||||
|
|
||||||
|
\section{Why the normalization is so clean}
|
||||||
|
|
||||||
|
The normalization factor in the definition of $\mathcal M_a$ is not arbitrary. For a state $\sigma_{\bar a}$ on the complement, the old correlation-sum identity gives
|
||||||
|
\begin{equation}
|
||||||
|
\sum_{\emptyset\neq T\subseteq\bar a}L_T(\sigma_{\bar a})
|
||||||
|
=2^{n-1}\tr(\sigma_{\bar a}^2)-1
|
||||||
|
\le 2^{n-1}-1.
|
||||||
|
\end{equation}
|
||||||
|
Thus for a pure cut-product term
|
||||||
|
\begin{equation}
|
||||||
|
\rho=\rho_a\otimes\sigma_{\bar a},
|
||||||
|
\end{equation}
|
||||||
|
the stacked target vector has squared norm at most $2^{n-1}-1$, while the source Bloch vector has norm at most $1$. Dividing by $\sqrt{2^{n-1}-1}$ therefore makes the rank-one nuclear norm at most $1$.
|
||||||
|
|
||||||
|
This is one of the nicest features of the construction. The geometry and the old purity identity fit together exactly.
|
||||||
|
|
||||||
|
\section{What one can already do with the individual summands}
|
||||||
|
|
||||||
|
The direct-sum map is the main object in the formal note, but the separate summands are not merely bookkeeping. Each individual sector map already gives a valid cut-separability criterion once it is normalized by the dimension of its own target subsystem.
|
||||||
|
|
||||||
|
For a fixed nonempty $T\subseteq\bar a$, define
|
||||||
|
\begin{equation}
|
||||||
|
\widehat M_{a\to T}(\rho)
|
||||||
|
=
|
||||||
|
\frac{1}{\sqrt{(d_a-1)(d_T-1)}}M_{a\to T}(\rho),
|
||||||
|
\qquad
|
||||||
|
d_T:=\prod_{b\in T}d_b.
|
||||||
|
\end{equation}
|
||||||
|
Then the same rank-one argument used for the full map shows that for every state separable across $a\mid\bar a$,
|
||||||
|
\begin{equation}
|
||||||
|
\norm{\widehat M_{a\to T}(\rho)}_*\le 1.
|
||||||
|
\end{equation}
|
||||||
|
So every summand already supplies its own witness.
|
||||||
|
|
||||||
|
This is conceptually useful. The full map answers the cut-level question ``how large is the total shadow cast by $a$ onto the whole complement?'' The summands answer the profiling question ``where does that shadow actually land?''
|
||||||
|
|
||||||
|
It is therefore natural to name the sector profiles explicitly:
|
||||||
|
\begin{equation}
|
||||||
|
\Phi_{a\to T}(\rho):=\norm{\widehat M_{a\to T}(\rho)}_*,
|
||||||
|
\qquad
|
||||||
|
\Phi^{(2)}_{a\to T}(\rho):=\norm{\widehat M_{a\to T}(\rho)}_{\fro}^2.
|
||||||
|
\end{equation}
|
||||||
|
These are not replacements for the full map. They are a diagnostic profile attached to it.
|
||||||
|
|
||||||
|
There is also an exact reconstruction formula. If $\iota_T$ denotes the canonical inclusion of the $T$-sector target space into the full direct sum, then
|
||||||
|
\begin{equation}
|
||||||
|
\mathcal M_a(\rho)
|
||||||
|
=
|
||||||
|
\sum_{\emptyset\neq T\subseteq\bar a}
|
||||||
|
\sqrt{\frac{d_T-1}{d_{\bar a}-1}}\;\iota_T\,\widehat M_{a\to T}(\rho).
|
||||||
|
\end{equation}
|
||||||
|
So the full map is literally the dimension-weighted orthogonal assembly of the separately normalized sector maps.
|
||||||
|
|
||||||
|
Because the target sectors are orthogonal, the Frobenius norm adds cleanly:
|
||||||
|
\begin{equation}
|
||||||
|
\norm{\mathcal M_a(\rho)}_{\fro}^2
|
||||||
|
=
|
||||||
|
\sum_{\emptyset\neq T\subseteq\bar a}
|
||||||
|
\frac{d_T-1}{d_{\bar a}-1}
|
||||||
|
\norm{\widehat M_{a\to T}(\rho)}_{\fro}^2.
|
||||||
|
\end{equation}
|
||||||
|
So for Frobenius-type criteria the full signal is just the weighted sum of the sector signals.
|
||||||
|
|
||||||
|
For the nuclear norm, however, there is no such scalar additivity. The reason is simple: the different sector maps all start from the same source space. So even though the target sectors are orthogonal, the sector shadows can still overlap in their right-singular directions. The full nuclear norm therefore depends not only on the size of each sector shadow but also on how those shadows align as channels out of the source party.
|
||||||
|
|
||||||
|
This is exactly why the direct-sum criterion contains more structural information than a mere list of sector sizes.
|
||||||
|
|
||||||
|
There is also an important invariance point. If one applies a collective unitary on the whole complement,
|
||||||
|
\begin{equation}
|
||||||
|
\rho'=(I_a\otimes U_{\bar a})\rho(I_a\otimes U_{\bar a}^{\dagger}),
|
||||||
|
\end{equation}
|
||||||
|
then the full map for the cut $a\mid\bar a$ changes only by an orthogonal rotation on its target space. So the full nuclear and Frobenius norms are unchanged. The coarse cut signal therefore does exactly what it should do: it depends only on the bipartite split $a\mid\bar a$, not on how one chooses coordinates on the complement.
|
||||||
|
|
||||||
|
By contrast, the sector profile is tied to the chosen internal factorization of the complement. A generic collective unitary on $\bar a$ mixes the $T$-sectors with one another. So the numbers $\Phi_{a\to T}(\rho)$ are not invariants of the coarse cut; they are diagnostics of how the cut-level signal is distributed relative to the specific decomposition of $\bar a$ into parties.
|
||||||
|
|
||||||
|
\section{Why the nuclear norm is the right refinement}
|
||||||
|
|
||||||
|
There is also a simpler Frobenius statement:
|
||||||
|
\begin{equation}
|
||||||
|
\norm{\mathcal M_a(\rho)}_{\fro}^2
|
||||||
|
=
|
||||||
|
\frac{1}{2^{n-1}-1}
|
||||||
|
\sum_{\emptyset\neq T\subseteq\bar a}L_{\{a\}\cup T}(\rho).
|
||||||
|
\end{equation}
|
||||||
|
For cut-separable states this is bounded by $1$ as well.
|
||||||
|
|
||||||
|
But this is only the old information in a reorganized form. It records total quadratic size, not directional complexity. The nuclear norm is stronger because it distinguishes a shadow that is essentially one-dimensional from a shadow spread over several independent directions.
|
||||||
|
|
||||||
|
This is exactly the lesson learned already in the bipartite flattening picture. One dominant singular value means one dominant channel. Several sizable singular values mean several independent channels. The direct-sum shadow criterion imports that lesson into the multipartite setting.
|
||||||
|
|
||||||
|
The distinction is visible already in a very simple example. Take three parties and the state
|
||||||
|
\begin{equation}
|
||||||
|
\rho_{ABC}=\lvert\mathrm{Bell}\rangle_{AB}\!\langle\mathrm{Bell}\rvert\otimes \lvert\psi\rangle_C\!\langle\psi\rvert.
|
||||||
|
\end{equation}
|
||||||
|
With $A$ as source, the shadow on $B$ is maximal, the shadow on $C$ vanishes, and the shadow on $BC$ is nonzero because the $ABC$ correlations factor into Bell correlations on $AB$ times the local Bloch vector of $C$.
|
||||||
|
|
||||||
|
For qubits, the $A\to B$ sector carries no dimension penalty, while both the full map and the $A\to BC$ sector are divided by $\sqrt3$. So the strongest localized signal is the $B$-only shadow, not the combined one. That is not a defect. It simply means that the full map is a balanced witness for the entire cut, while the sectorwise maps are more diagnostic about where the entanglement actually sits. Distributed states such as GHZ-type states are the opposite kind of example: there the combined map benefits from several sectors at once.
|
||||||
|
|
||||||
|
This also resolves the apparent white-noise paradox. Suppose $\lvert\psi\rangle_{ABC}$ is a pure state with maximally mixed marginal on $A$. Then some collective unitary on $BC$ converts it to
|
||||||
|
\begin{equation}
|
||||||
|
\lvert\Phi^+\rangle_{AB}\otimes\lvert\eta\rangle_C.
|
||||||
|
\end{equation}
|
||||||
|
If one mixes in white noise,
|
||||||
|
\begin{equation}
|
||||||
|
\rho_p = p\lvert\psi\rangle\!\langle\psi\rvert + (1-p)\frac{\id}{8},
|
||||||
|
\end{equation}
|
||||||
|
the same collective unitary gives
|
||||||
|
\begin{equation}
|
||||||
|
\rho'_p=(I_A\otimes U_{BC})\rho_p(I_A\otimes U_{BC}^{\dagger}).
|
||||||
|
\end{equation}
|
||||||
|
The white-noise part is unchanged, and the full cut map for $A\mid BC$ is merely orthogonally rotated. So the full cut signal and its noise threshold are identical for $\rho_p$ and $\rho'_p$.
|
||||||
|
|
||||||
|
What changes is the sector profile. For the concrete Bell-product state
|
||||||
|
\begin{equation}
|
||||||
|
\lvert\Phi^+\rangle_{AB}\otimes\lvert 0\rangle_C,
|
||||||
|
\end{equation}
|
||||||
|
one finds
|
||||||
|
\begin{equation}
|
||||||
|
\Phi_{A\to B}=3,
|
||||||
|
\qquad
|
||||||
|
\Phi_{A\to C}=0,
|
||||||
|
\qquad
|
||||||
|
\Phi_{A\to BC}=\sqrt 3,
|
||||||
|
\qquad
|
||||||
|
\norm{\mathcal M_A}_*=\sqrt 6.
|
||||||
|
\end{equation}
|
||||||
|
After applying the Bell-basis change
|
||||||
|
\begin{equation}
|
||||||
|
U_{BC}=\mathrm{CNOT}_{B\to C}(H_B\otimes I_C),
|
||||||
|
\end{equation}
|
||||||
|
the same full cut value remains
|
||||||
|
\begin{equation}
|
||||||
|
\norm{\mathcal M_A}_*=\sqrt 6,
|
||||||
|
\end{equation}
|
||||||
|
but the profile becomes
|
||||||
|
\begin{equation}
|
||||||
|
\Phi_{A\to B}=1,
|
||||||
|
\qquad
|
||||||
|
\Phi_{A\to C}=1,
|
||||||
|
\qquad
|
||||||
|
\Phi_{A\to BC}=\sqrt{\tfrac83}.
|
||||||
|
\end{equation}
|
||||||
|
So the signal does not move purely into the $A\to BC$ sector. What happens instead is a sharp redistribution from a strongly localized $A\to B$ witness to a mixed profile spread across $A\to B$, $A\to C$, and $A\to BC$, while the full cut singular values stay unchanged.
|
||||||
|
|
||||||
|
This makes the white-noise behavior more interesting, not less. The full cut threshold stays
|
||||||
|
\begin{equation}
|
||||||
|
p>\frac{1}{\sqrt 6},
|
||||||
|
\end{equation}
|
||||||
|
but the sector thresholds change drastically. Before the collective rotation, the sector $A\to B$ alone already detects for $p>1/3$. After the rotation, the sectors $A\to B$ and $A\to C$ never strictly violate the cut-separable bound at all, because their pure-state values are exactly $1$, and the sector $A\to BC$ only detects for $p>\sqrt{3/8}$. In particular, at $p=0.60$ the full map still witnesses entanglement after the collective rotation, whereas every individual sector misses it.
|
||||||
|
|
||||||
|
So the separate summands tell us how the entanglement is organized relative to the chosen internal decomposition of the complement, while the full map tells us how much entanglement there is across the coarse cut itself. That is the right division of labor.
|
||||||
|
|
||||||
|
\section{What changes when the source itself has more than one party}
|
||||||
|
|
||||||
|
So far the source side has always been a single party $a$. Nothing forces that. The same construction goes through for any cluster of parties $S$ acting jointly as the source, and it is worth seeing why in plain terms before looking at the formal statement.
|
||||||
|
|
||||||
|
Suppose the source is two parties, $S=\{A,B\}$, rather than one. The traceless operator space on $AB$ jointly does not need to be treated as one undifferentiated block. It splits, exactly as the complement always did, according to which of $A,B$ are actually ``doing something'' in a given correlation coefficient:
|
||||||
|
\begin{itemize}
|
||||||
|
\item a coefficient with $A$ nontrivial and $B$ trivial is a plain $A$-marginal effect;
|
||||||
|
\item a coefficient with $B$ nontrivial and $A$ trivial is a plain $B$-marginal effect;
|
||||||
|
\item a coefficient with both $A$ and $B$ nontrivial is \emph{genuine} $AB$ structure, correlation that cannot be attributed to either party alone.
|
||||||
|
\end{itemize}
|
||||||
|
These three pieces are orthogonal subspaces of the two-party traceless operator space, in exactly the same sense that the target-side sectors $T\subseteq\bar a$ were orthogonal all along. Nothing new has to be invented to write this down; it is the same tensor-product decomposition applied to the source instead of the target.
|
||||||
|
|
||||||
|
Once the source side is graded this way, the response operator naturally becomes \emph{bigraded}: for every source piece $V\in\{A,B,AB\}$ and every target sector $T$ of the complement, there is a block $M_{V\to T}$, and stacking all of them, with the same normalization idea as before, gives the combined bigraduated shadow map $\mathcal M_S$.
|
||||||
|
|
||||||
|
The proof that $\|\mathcal M_S(\rho)\|_*\le1$ for states separable across $S\mid S^c$ costs nothing extra. For a product state $\rho_S\otimes\sigma_{S^c}$, every block factorizes the same way regardless of which source piece $V$ it comes from, because the whole point of a product state is that its correlation coefficients factorize block by block, source side and target side alike. Stacking the source blocks just reassembles the ordinary Bloch vector of the two-party state $\rho_S$, treated as one composite $d_S$-dimensional party; the same correlation-sum bound that controlled a single party's Bloch vector controls this composite one without modification. The whole argument is the same proof, run once more with a bigger source alphabet.
|
||||||
|
|
||||||
|
\subsection*{Sub-block witnesses come for free}
|
||||||
|
|
||||||
|
Once the response operator is graded this finely, one can look at any sub-collection of its blocks and still get a valid witness, simply because throwing away rows and columns of a matrix (formally, compressing it with an orthogonal projection on either side) can only shrink its nuclear norm. In particular, the single block $M_{S\to T}$ that keeps only the fully genuine source piece $V=S$ isolates the correlation attributable to the source cluster acting jointly, with every individual-party contribution filtered out. This block is a valid witness completely on its own: if it alone already exceeds the bound, that already certifies entanglement, and it does so more specifically than the full stacked operator, because it has deliberately discarded everything that a single source party could have produced by itself.
|
||||||
|
|
||||||
|
\subsection*{Why this matters: the Smolin state seen at two different resolutions}
|
||||||
|
|
||||||
|
The four-qubit Smolin state is the cleanest illustration of why this refinement is worth having. Viewed one party at a time, the shadow criterion sees a clear violation, $\|\mathcal M_A(\rho_{\mathrm{Smo}})\|_*=3/\sqrt7\approx1.13$, correctly flagging that the state is entangled across every one-versus-three cut. But the Smolin state is also a textbook example of a state that is separable across \emph{every} two-versus-two cut; a single-party construction has no way to even ask that question, because its source side is always exactly one party.
|
||||||
|
|
||||||
|
The cluster construction can ask it directly. Take $S=\{A,B\}$ and $S^c=\{C,D\}$. Because the Smolin state carries no one- or three-body correlations, every block of $\mathcal M_{AB}$ vanishes except the fully genuine one, $M_{AB\to CD}$. That single surviving block turns out to have three equal singular values, and after the correct normalization for a two-versus-two cut, the resulting nuclear norm comes out to be exactly $1$: sitting precisely on the boundary, not over it. That is not a coincidence or a near-miss; it is the shadow criterion correctly reporting that this particular cut is consistent with separability, exactly as it should for a state that is genuinely separable there. The same tool that clearly detects entanglement at $1\mid3$ resolution correctly stands down at $2\mid2$ resolution, without needing to be told in advance which cut is the interesting one.
|
||||||
|
|
||||||
|
\section{Why the symmetric aggregates are natural}
|
||||||
|
|
||||||
|
Once one has the family $\{\mathcal M_a\}_{a\in P}$, two permutation-invariant scalars are immediate:
|
||||||
|
\begin{equation}
|
||||||
|
\Phi_{\mathrm{sym}}(\rho)=\frac{1}{n}\sum_{a\in P}\norm{\mathcal M_a(\rho)}_*,
|
||||||
|
\qquad
|
||||||
|
\Phi_{\max}(\rho)=\max_{a\in P}\norm{\mathcal M_a(\rho)}_*.
|
||||||
|
\end{equation}
|
||||||
|
The maximum asks whether at least one one-vs-rest cut has a large combined shadow. The average asks whether the state is simultaneously large across many such cuts.
|
||||||
|
|
||||||
|
These are the most natural symmetric descendants of the cut-wise criterion. They do not introduce new structure; they simply package the family of one-vs-rest ellipsoids into permutation-invariant scalars.
|
||||||
|
|
||||||
|
For full separability the benchmark is immediate, because a fully separable state is separable across every one-vs-rest cut. For genuine multipartite entanglement one needs a stronger benchmark: the maximum or average over the \emph{biseparable} set. That is why the three-qubit case is special --- there the symmetric average can be optimized explicitly over biseparable states.
|
||||||
|
|
||||||
|
\section{How to read the examples}
|
||||||
|
|
||||||
|
Two examples capture the point particularly well.
|
||||||
|
|
||||||
|
\subsection*{Three-qubit GHZ}
|
||||||
|
|
||||||
|
For $\lvert\GHZ_3\rangle$, each source party produces three orthogonal response directions of equal size. So the combined shadow ellipsoid is not a line segment at all; it has three equal axes. This is exactly the kind of pattern the old Frobenius norms blur together but the singular-value picture retains.
|
||||||
|
|
||||||
|
The explicit three-qubit biseparable threshold then shows that the symmetric average does more than detect generic entanglement. It can certify genuine tripartite entanglement in this case.
|
||||||
|
|
||||||
|
\subsection*{Four-qubit Smolin}
|
||||||
|
|
||||||
|
The Smolin state is useful for the opposite reason. Its one-vs-rest combined shadows are still large enough to violate the fully separable bound, but this does \emph{not} imply genuine multipartite entanglement, because the state is separable across every $2\mid 2$ split. So the example is a warning as well as a success: strong one-vs-rest shadow geometry certifies non-full-separability very clearly, but by itself it does not yet solve the full biseparable problem in higher-party systems.
|
||||||
|
|
||||||
|
\section{A first four-qubit numerical scan}
|
||||||
|
|
||||||
|
The new \texttt{qtensor} package makes it easy to test whether the shadow geometry is restricted to a few hand-picked examples or whether it persists across broader families. The first scan worth doing is over four-qubit graph states.
|
||||||
|
|
||||||
|
For the pure states $\GHZ_4$, the line graph, the ring graph, and the star graph, one finds numerically
|
||||||
|
\begin{equation}
|
||||||
|
\Phi_{\mathrm{sym}}=\Phi_{\max}=\frac{6}{\sqrt 7}\approx 2.268.
|
||||||
|
\end{equation}
|
||||||
|
This is already striking because these families have rather different pairwise reduced states. For $\GHZ_4$ all two-qubit marginals are diagonal and PPT; for the line and ring graphs some pairs are maximally mixed, while the remaining pairs are still PPT. So the shadow functional is clearly seeing something beyond ordinary pairwise structure.
|
||||||
|
|
||||||
|
The stronger surprise is that this value is not special to just those named examples. A numerical scan over all $38$ connected labeled graph states on four qubits gives exactly the same shadow value in every case. In particular, for every such connected graph state,
|
||||||
|
\begin{equation}
|
||||||
|
\Phi_{\mathrm{sym}}=\Phi_{\max}=\frac{6}{\sqrt 7}.
|
||||||
|
\end{equation}
|
||||||
|
Under white-noise admixture,
|
||||||
|
\begin{equation}
|
||||||
|
\rho(p)=p\rho+(1-p)\frac{\id}{16},
|
||||||
|
\end{equation}
|
||||||
|
the fully separable benchmark is therefore crossed already at
|
||||||
|
\begin{equation}
|
||||||
|
p>\frac{\sqrt 7}{6}\approx 0.441.
|
||||||
|
\end{equation}
|
||||||
|
|
||||||
|
There is also a useful systematic pattern beyond the four-qubit scan. For $n=3,4,5$, the families $\GHZ_n$, the line graph state, and the ring graph state all give the same numerical value of $\Phi_{\mathrm{sym}}$ within machine precision. The common values decrease with $n$ --- from $\sqrt 6$ at $n=3$ to $6/\sqrt 7$ at $n=4$ and then to $2.19089\ldots$ at $n=5$ --- but the coincidence across these different graph-like families persists. By contrast, the $W_n$ family sits slightly lower at each scanned $n$, while D\"ur states are already below the fully separable benchmark for $n=4,5$. So the shadow functional appears to single out a fairly rigid kind of global graph-like channel structure.
|
||||||
|
|
||||||
|
We also made a first random search over pure four-qubit biseparable states, sampling all inequivalent cuts. The largest sampled value was
|
||||||
|
\begin{equation}
|
||||||
|
\Phi_{\mathrm{sym}}\approx 2.235,
|
||||||
|
\end{equation}
|
||||||
|
obtained for a $2\mid 2$ product state, whereas the best sampled $1\mid 3$ values stayed near $1.94$. This is only a numerical hint, not a theorem, but it is informative. It says that if one eventually wants the sharp four-qubit biseparable threshold, the hard competitors are likely to come from $2\mid 2$ cuts. It also says that the connected graph-state value $6/\sqrt 7\approx 2.268$ lies just above the best random biseparable examples we found.
|
||||||
|
|
||||||
|
Figure~\ref{fig:noisy-graph-scan} summarizes the numerics for the representative families $\GHZ_4$, line, ring, and star. The upper panel shows that the shadow functional crosses the fully separable threshold at the common value $p=\sqrt 7/6$. The lower panel shows that the minimum eigenvalue of the partial transpose of every two-qubit marginal stays nonnegative throughout that detection region. This does not yet prove genuine multipartite entanglement by the shadow functional alone, because the four-qubit biseparable threshold is not yet known. But it strongly suggests that the criterion is responding to a genuinely multipartite channel structure that pairwise tests fail to reveal.
|
||||||
|
|
||||||
|
\begin{figure}[t]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.92\linewidth]{numerics/figures/noisy_graph_family_scan.png}
|
||||||
|
\caption{Numerical scan performed with \texttt{qtensor} for noisy four-qubit graph-state families. Top: the symmetric shadow functional for $\GHZ_4$, line, ring, and star graph states under white noise. Bottom: the smallest eigenvalue of the partial transpose of a two-qubit marginal for the same families. The shadow signal crosses the fully separable threshold at $p=\sqrt 7/6$, while all two-qubit marginals remain PPT in that region.}
|
||||||
|
\label{fig:noisy-graph-scan}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\section{The single object behind every construction in this note}
|
||||||
|
|
||||||
|
Every object introduced so far --- the single-party map $M_a$, its cluster generalization $\mathcal M_S$, and every sub-block restriction of either --- turns out to be a view of one and the same underlying object. It is worth seeing this explicitly, because it explains why none of the earlier bounds needed a separate proof.
|
||||||
|
|
||||||
|
\subsection*{A picture: one big data cube, many ways to flatten it}
|
||||||
|
|
||||||
|
Imagine collecting every correlation coefficient of $\rho$, for every party, into one giant array with one axis per party. On the axis belonging to party $a$, instead of only the $d_a^2-1$ traceless directions, also keep one extra slot for ``party $a$ was not measured at all'' (the identity direction). This turns the whole collection into a single $n$-axis data cube, one axis per party, where every axis includes a ``not measured'' option.
|
||||||
|
|
||||||
|
This cube is the natural common ancestor of everything else in this note. If one slices the cube by declaring a subset $V$ of parties ``measured'' and everyone else ``not measured'', the result is exactly the ordinary correlation tensor $C_V(\rho)$ for that subset. So the sector decomposition used everywhere in this note, on the target side and on the source side alike, is not extra bookkeeping laid on top of the correlation data; it is simply the fact that a cube with several axes naturally organizes itself by which axes are ``in use''.
|
||||||
|
|
||||||
|
It is worth being clear that this cube is not something added on top of the Aschauer \emph{et al.} framework from outside. It is, quite literally, the object that framework starts from: the very first equations of \cite{aschauer} expand the state in the full product basis of local generators \emph{together with the identity} on every party, which is exactly this cube, axis for axis. The sector-restricted correlation tensors $C_S(\rho)$ used to build $L_S$ throughout that framework are obtained from it by the same slicing operation described above; they were never a different object, only a restricted view of this one. What the present note adds is not the cube, which was already there, but the observation that looking at more of it at once, and unfolding it into a matrix instead of collapsing it to a scalar, uncovers structure that slicing straight down to $L_S$ throws away.
|
||||||
|
|
||||||
|
\subsection*{Product states are the simplest possible cube}
|
||||||
|
|
||||||
|
A completely uncorrelated, fully factorized state $\rho=\bigotimes_a\rho_a$ produces the simplest cube there is: one that factors into a separate vector along each axis, so that every entry of the cube is just a product of one number from each party's own vector. This is the tensor analogue of a rank-one matrix, and the formal note makes this exact: the cube factors completely along every axis if and only if the state itself is a full product state.
|
||||||
|
|
||||||
|
\subsection*{Unfolding: turning the cube back into a matrix}
|
||||||
|
|
||||||
|
The reason this note works with matrices at all, rather than with the cube directly, is that a cube does not have a clean, efficiently computable notion of ``how far from rank one is it''. Matrices do: that is exactly the singular value decomposition used throughout. So the practical move is to \emph{unfold} the cube into a matrix by choosing a bipartition of the parties, gathering all the source-side axes into one long row index and all the target-side axes into one long column index. This is a completely standard operation on multi-axis data, sometimes called a mode unfolding or matricization. Every shadow map in this note, from the single-party $M_a$ to the cluster map $\mathcal M_S$ and every sub-block restriction of either, is exactly such an unfolding of the same underlying cube, for one particular choice of which axes go on which side.
|
||||||
|
|
||||||
|
Crucially, unfolding a rank-one cube always produces a rank-one matrix, no matter which bipartition is chosen. That is the single fact underlying every bound proved in this note: separability makes the cube (a convex mixture of) rank one, every unfolding of a rank-one cube is rank one, and a rank-one matrix always has nuclear norm equal to the product of two vector lengths, which the normalization is chosen precisely to keep below $1$. None of the $\le1$ statements in this note, for a single party, for a cluster, or for any sub-block, ever needed its own separate argument; they are the same rank-one fact, looked at through a different choice of which axes get folded into rows and which into columns.
|
||||||
|
|
||||||
|
\subsection*{Tracing out a party is cutting a slice, not adding anything up}
|
||||||
|
|
||||||
|
One more piece of intuition is worth having explicitly, because it resolves a question that comes up naturally once several parties are in play: if a party is thrown away by tracing it out, is information lost that was only visible while that party was still there?
|
||||||
|
|
||||||
|
The answer is no, and the cube picture makes it obvious why. Tracing out a party $E$ corresponds to slicing the cube at the ``not measured'' position on $E$'s axis, nothing more. It is not a sum or an average over that axis; it is simply looking at the one slice of the cube where $E$ never appears. Every correlation coefficient that does not involve $E$ was already sitting in that slice before $E$ was traced out, completely unchanged. What does change is the normalization: a shadow map built directly from the smaller, $E$-free state uses a smaller effective target dimension than the same block would have used inside the full cube, so the very same numbers get rescaled upward once $E$ is genuinely removed rather than merely ignored. This is the difference between a witness that only says ``entangled across $S\mid RE$, somewhere'' and the sharper, more demanding witness that says ``entangled across $S\mid R$, and that entanglement survives even if $E$ is thrown away completely''. The second statement is strictly stronger, and the cube picture shows that it costs nothing beyond correctly bookkeeping which slice one happens to be looking at.
|
||||||
|
|
||||||
|
\section{Where the moment hierarchy fits}
|
||||||
|
|
||||||
|
There is a natural broader picture behind all this. The full Pauli correlation coefficients determine the density matrix linearly, so the separability problem can be formulated directly in the space of correlation moments. For qubits this becomes a truncated moment problem on a product of Bloch spheres.
|
||||||
|
|
||||||
|
From that viewpoint the old criterion $L_S>1$ is a very compressed front-end test, and the shadow-map criterion is a better one: it keeps some of the real geometry while staying simple and explicit. The full moment hierarchy is the exact continuation of the same program, but it is a larger project and does not belong in the core of the present note.
|
||||||
|
|
||||||
|
So the right way to think about the shadow maps is not as a competing philosophy, but as a natural intermediate level:
|
||||||
|
\begin{center}
|
||||||
|
old quadratic summaries \; $\to$ \; geometric response maps \; $\to$ \; exact correlation-moment hierarchy.
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
\section{Closing summary}
|
||||||
|
|
||||||
|
The shortest summary is this. The Aschauer \emph{et al.} framework already had the right ambient geometry: correlations were organized into invariant sectors. What it compressed too strongly was the internal directional structure of those sectors. The shadow-map construction restores some of that lost structure.
|
||||||
|
|
||||||
|
The central geometric statement is equally short. A source party produces response vectors in several orthogonal sectors on the complement. For cut-product states all of those shadows must remain locked to one common scalar factor. Entanglement is witnessed by the failure of that locking.
|
||||||
|
|
||||||
|
Two further points round this out, and both turned out to be free once the central statement was understood correctly. First, ``source party'' never had to mean a single party: the same locking argument applies verbatim to any cluster of parties acting jointly as the source, and grading the source side the way the target side was always graded exposes sub-block witnesses, such as the purely genuine cross-cluster block, that a single-party construction cannot even formulate. Second, every one of these objects, single-party or cluster, full map or sub-block, is a different flattening of one and the same correlation cube; the recurring bound is one rank-one fact about that cube, not a family of separately earned results.
|
||||||
|
|
||||||
|
That is the idea behind the formal criterion.
|
||||||
|
|
||||||
|
\begin{thebibliography}{99}
|
||||||
|
|
||||||
|
\bibitem{aschauer}
|
||||||
|
H.~Aschauer, J.~Calsamiglia, M.~Hein, and H.~J.~Briegel,
|
||||||
|
\emph{Local invariants for multi-partite entangled states allowing for a simple entanglement criterion},
|
||||||
|
quant-ph/0306048.
|
||||||
|
|
||||||
|
\bibitem{chenwu}
|
||||||
|
K.~Chen and L.-A.~Wu,
|
||||||
|
\emph{A matrix realignment method for recognizing entanglement},
|
||||||
|
Quantum Inf. Comput. \textbf{3}, 193--202 (2003).
|
||||||
|
|
||||||
|
\bibitem{devicente}
|
||||||
|
J.~I.~de Vicente,
|
||||||
|
\emph{Separability criteria based on the Bloch representation of density matrices},
|
||||||
|
quant-ph/0607195.
|
||||||
|
|
||||||
|
\bibitem{hassanjoag}
|
||||||
|
A.~S.~M.~Hassan and P.~S.~Joag,
|
||||||
|
\emph{Separability criterion for multipartite quantum states based on the Bloch representation of density matrices},
|
||||||
|
arXiv:0704.3942.
|
||||||
|
|
||||||
|
\bibitem{devicentehuber}
|
||||||
|
J.~I.~de Vicente and M.~Huber,
|
||||||
|
\emph{Multipartite entanglement detection from correlation tensors},
|
||||||
|
arXiv:1106.5756.
|
||||||
|
|
||||||
|
\bibitem{laskowski2011}
|
||||||
|
W.~Laskowski, M.~Markiewicz, T.~Paterek, and M.~\.{Z}ukowski,
|
||||||
|
\emph{Correlation tensor criteria for genuine multiqubit entanglement},
|
||||||
|
arXiv:1110.4108.
|
||||||
|
|
||||||
|
\bibitem{klocklhuber2015}
|
||||||
|
C.~Kl\"ockl and M.~Huber,
|
||||||
|
\emph{Characterizing multipartite entanglement without shared reference frames},
|
||||||
|
arXiv:1411.5399.
|
||||||
|
|
||||||
|
\bibitem{li2014}
|
||||||
|
M.~Li, J.~Wang, S.-M.~Fei, and X.~Li-Jost,
|
||||||
|
\emph{Quantum separability criteria for arbitrary dimensional multipartite states},
|
||||||
|
arXiv:1402.4428.
|
||||||
|
|
||||||
|
\bibitem{shen2016}
|
||||||
|
S.-Q.~Shen, J.~Yu, M.~Li, and S.-M.~Fei,
|
||||||
|
\emph{Improved separability criteria based on Bloch representation of density matrices},
|
||||||
|
arXiv:1608.01547.
|
||||||
|
|
||||||
|
\bibitem{sarbicki2020}
|
||||||
|
G.~Sarbicki, G.~Scala, and D.~Chru\'sci\'nski,
|
||||||
|
\emph{A family of multipartite separability criteria based on correlation tensor},
|
||||||
|
arXiv:2001.08258.
|
||||||
|
|
||||||
|
\bibitem{zhao2020}
|
||||||
|
H.~Zhao, M.-M.~Zhang, N.~Jing, and Z.-X.~Wang,
|
||||||
|
\emph{Separability criteria based on Bloch representation of density matrices},
|
||||||
|
arXiv:2004.11525.
|
||||||
|
|
||||||
|
\bibitem{jingzhang2023}
|
||||||
|
N.~Jing and M.~Zhang,
|
||||||
|
\emph{Criteria of genuine multipartite entanglement based on correlation tensors},
|
||||||
|
arXiv:2301.06463.
|
||||||
|
|
||||||
|
\bibitem{huang2024extended}
|
||||||
|
X.~Huang, T.~Zhang, and N.~Jing,
|
||||||
|
\emph{A unifying separability criterion based on extended correlation tensor},
|
||||||
|
arXiv:2406.17230.
|
||||||
|
|
||||||
|
\bibitem{liyaoyangfei2025}
|
||||||
|
L.~Li, H.~Yao, C.~Yang, and S.~Fei,
|
||||||
|
\emph{Separability criteria of quantum states based on generalized Bloch representation},
|
||||||
|
arXiv:2510.24110.
|
||||||
|
|
||||||
|
\end{thebibliography}
|
||||||
|
|
||||||
|
\end{document}
|
||||||
14
pyproject.toml
Normal file
14
pyproject.toml
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
[project]
|
||||||
|
name = "2026-05-07-quantum-info"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "Add your description here"
|
||||||
|
readme = "README.md"
|
||||||
|
requires-python = ">=3.13"
|
||||||
|
dependencies = [
|
||||||
|
"matplotlib>=3.10.9",
|
||||||
|
"qtensor",
|
||||||
|
"sympy>=1.14.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.uv.sources]
|
||||||
|
qtensor = { path = "../qtensor" }
|
||||||
81
scripts/README.md
Normal file
81
scripts/README.md
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
# Reproducibility Scripts
|
||||||
|
|
||||||
|
This directory contains small numerical scripts used to reproduce values quoted in the paper. Scripts should be executable from the repository root unless noted otherwise.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Python 3
|
||||||
|
- NumPy
|
||||||
|
|
||||||
|
Install the only current dependency with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 -m pip install numpy
|
||||||
|
```
|
||||||
|
|
||||||
|
## Current Scripts
|
||||||
|
|
||||||
|
### `tiles_upb.py`
|
||||||
|
|
||||||
|
Computes the two-qutrit Tiles unextendible-product-basis benchmark used in `paper/symmetric_shadow_maps_formal.tex`. The script uses Gell-Mann generators scaled so that `Tr(sigma_i sigma_j) = 3 delta_ij`, matching the paper's generator normalization.
|
||||||
|
|
||||||
|
Run from the repository root:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 scripts/tiles_upb.py
|
||||||
|
```
|
||||||
|
|
||||||
|
The script constructs the five Tiles UPB product vectors, forms the normalized projector onto their four-dimensional orthogonal complement, and prints:
|
||||||
|
|
||||||
|
- the UPB Gram matrix;
|
||||||
|
- the density-matrix trace, Hermiticity check, and spectrum;
|
||||||
|
- the partial-transpose spectrum and minimum eigenvalue;
|
||||||
|
- the shadow-map value `||M_A(rho)||_*`, normalized by `sqrt((3-1)(3-1)) = 2`;
|
||||||
|
- the CCNR/realignment trace norm for comparison.
|
||||||
|
|
||||||
|
The values used in `paper/symmetric_shadow_maps_formal.tex` are:
|
||||||
|
|
||||||
|
| quantity | value |
|
||||||
|
| --- | ---: |
|
||||||
|
| minimum eigenvalue of partial transpose | `-1.5922869149236308e-16` |
|
||||||
|
| unnormalized correlation nuclear norm | `2.1068432645403345` |
|
||||||
|
| normalized shadow-map value | `1.0534216322701673` |
|
||||||
|
| CCNR/realignment trace norm | `1.087412464837521` |
|
||||||
|
|
||||||
|
The tiny negative partial-transpose eigenvalue is numerical roundoff; the state is the standard PPT-entangled Tiles UPB state. The paper compares the normalized shadow-map value to the separability bound `<= 1`.
|
||||||
|
|
||||||
|
### `grraph_state_cuts.py`
|
||||||
|
|
||||||
|
Computes the cut-resolved bigraduated shadow-map values for the four-qubit ring graph state with edges `(1,2)`, `(2,3)`, `(3,4)`, `(4,1)`. Internally the script uses zero-based qubit labels.
|
||||||
|
|
||||||
|
Run from the repository root:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 scripts/grraph_state_cuts.py
|
||||||
|
```
|
||||||
|
|
||||||
|
The script constructs the graph state, computes its Pauli correlation tensor, forms the normalized `2|2` source-target unfoldings, and prints:
|
||||||
|
|
||||||
|
- the full normalized nuclear norm `||M_S||_*` for each cut;
|
||||||
|
- the normalized full-sector block, obtained by keeping only nonidentity Pauli labels on both source qubits and both target qubits;
|
||||||
|
- the eigenvalues of the two-qubit source marginal and its distance from the maximally mixed state.
|
||||||
|
|
||||||
|
The values used in `paper/symmetric_shadow_maps_formal.tex` are:
|
||||||
|
|
||||||
|
| cut | full normalized norm | normalized full-sector block | source marginal |
|
||||||
|
| --- | ---: | ---: | --- |
|
||||||
|
| adjacent `{1,2}|{3,4}` | `5` | `5/3` | maximally mixed |
|
||||||
|
| diagonal `{1,3}|{2,4}` | `7/3` | `1` | eigenvalues `1/2, 1/2, 0, 0` |
|
||||||
|
| adjacent `{1,4}|{2,3}` | `5` | `5/3` | maximally mixed |
|
||||||
|
|
||||||
|
The script also prints raw, unnormalized nuclear norms. The paper compares only the normalized values to the separability bound `<= 1`.
|
||||||
|
|
||||||
|
## Adding New Scripts
|
||||||
|
|
||||||
|
When adding another script, add a short entry above with:
|
||||||
|
|
||||||
|
- the purpose of the script;
|
||||||
|
- the command needed to run it from the repository root;
|
||||||
|
- required dependencies beyond NumPy, if any;
|
||||||
|
- the paper values, table, or figure it reproduces;
|
||||||
|
- notes about normalization conventions if the output includes both raw and normalized quantities.
|
||||||
83
scripts/grraph_state_cuts.py
Normal file
83
scripts/grraph_state_cuts.py
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
import numpy as np
|
||||||
|
from itertools import product, combinations
|
||||||
|
|
||||||
|
I=np.array([[1,0],[0,1]],complex)
|
||||||
|
X=np.array([[0,1],[1,0]],complex)
|
||||||
|
Y=np.array([[0,-1j],[1j,0]],complex)
|
||||||
|
Z=np.array([[1,0],[0,-1]],complex)
|
||||||
|
paulis=[I,X,Y,Z]
|
||||||
|
labels=['I','X','Y','Z']
|
||||||
|
|
||||||
|
def kron_all(ops):
|
||||||
|
out=ops[0]
|
||||||
|
for op in ops[1:]: out=np.kron(out,op)
|
||||||
|
return out
|
||||||
|
|
||||||
|
def graph_state(n, edges):
|
||||||
|
psi=np.ones(2**n,complex)/np.sqrt(2**n)
|
||||||
|
# basis index bits qubit 0..n-1 as MSB? phase invariant consistent
|
||||||
|
for idx in range(2**n):
|
||||||
|
bits=[(idx>>(n-1-q))&1 for q in range(n)]
|
||||||
|
phase=1
|
||||||
|
for a,b in edges:
|
||||||
|
if bits[a]*bits[b]: phase*=-1
|
||||||
|
psi[idx]*=phase
|
||||||
|
return psi
|
||||||
|
|
||||||
|
def corr_tensor(psi,n):
|
||||||
|
coeff={}
|
||||||
|
for inds in product(range(4), repeat=n):
|
||||||
|
op=kron_all([paulis[i] for i in inds])
|
||||||
|
val=np.vdot(psi, op@psi)
|
||||||
|
if abs(val)>1e-9:
|
||||||
|
coeff[inds]=float(np.real_if_close(val))
|
||||||
|
return coeff
|
||||||
|
|
||||||
|
def matrix_for_cut(coeff,S,n, source_full=False, target_full=False):
|
||||||
|
Sc=[i for i in range(n) if i not in S]
|
||||||
|
row=[]; col=[]
|
||||||
|
for inds in product(range(4), repeat=len(S)):
|
||||||
|
if all(i==0 for i in inds): continue
|
||||||
|
if source_full and any(i==0 for i in inds): continue
|
||||||
|
row.append(inds)
|
||||||
|
for inds in product(range(4), repeat=len(Sc)):
|
||||||
|
if all(i==0 for i in inds): continue
|
||||||
|
if target_full and any(i==0 for i in inds): continue
|
||||||
|
col.append(inds)
|
||||||
|
M=np.zeros((len(col),len(row))) # target rows, source cols
|
||||||
|
for r,tinds in enumerate(col):
|
||||||
|
for c,sinds in enumerate(row):
|
||||||
|
full=[0]*n
|
||||||
|
for q,ind in zip(S,sinds): full[q]=ind
|
||||||
|
for q,ind in zip(Sc,tinds): full[q]=ind
|
||||||
|
M[r,c]=coeff.get(tuple(full),0.0)
|
||||||
|
return M,row,col
|
||||||
|
|
||||||
|
def partial_rho(psi, keep, n):
|
||||||
|
rho=np.outer(psi, psi.conj()).reshape([2]*n*2)
|
||||||
|
trace=[i for i in range(n) if i not in keep]
|
||||||
|
# trace out from high to low axes
|
||||||
|
for q in sorted(trace, reverse=True):
|
||||||
|
rho=np.trace(rho, axis1=q, axis2=q+rho.ndim//2)
|
||||||
|
d=2**len(keep)
|
||||||
|
return rho.reshape(d,d)
|
||||||
|
|
||||||
|
n=4
|
||||||
|
edges=[(0,1),(1,2),(2,3),(3,0)]
|
||||||
|
psi=graph_state(n,edges)
|
||||||
|
coeff=corr_tensor(psi,n)
|
||||||
|
print('nonzero coeffs', len(coeff))
|
||||||
|
for cutname,S in [('adjacent12|34',[0,1]),('diagonal13|24',[0,2]),('adjacent14|23',[0,3])]:
|
||||||
|
M,_,_=matrix_for_cut(coeff,S,n)
|
||||||
|
G,_,_=matrix_for_cut(coeff,S,n,source_full=True,target_full=True)
|
||||||
|
norm=np.linalg.svd(M/3, compute_uv=False).sum()
|
||||||
|
rawn=np.linalg.svd(M, compute_uv=False).sum()
|
||||||
|
gnorm=np.linalg.svd(G/3, compute_uv=False).sum()
|
||||||
|
graw=np.linalg.svd(G, compute_uv=False).sum()
|
||||||
|
print('\n',cutname)
|
||||||
|
print('full normalized',norm,'raw',rawn,'sing',np.linalg.svd(M/3,compute_uv=False))
|
||||||
|
print('genuine normalized',gnorm,'raw',graw,'sing',np.linalg.svd(G/3,compute_uv=False))
|
||||||
|
rho=partial_rho(psi,S,n)
|
||||||
|
print('rho eigen',np.linalg.eigvalsh(rho),'max mixed dist',np.linalg.norm(rho-np.eye(4)/4))
|
||||||
|
# list nonzero stabilizers labels
|
||||||
|
# print rows/cols maybe
|
||||||
105
scripts/tiles_upb.py
Normal file
105
scripts/tiles_upb.py
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
np.set_printoptions(precision=5, suppress=True)
|
||||||
|
|
||||||
|
# ---------- Gell-Mann generators for d=3, normalized so Tr(sigma_i sigma_j) = 3*delta_ij ----------
|
||||||
|
i_ = 1j
|
||||||
|
lam = [None]*9
|
||||||
|
lam[1] = np.array([[0,1,0],[1,0,0],[0,0,0]], dtype=complex)
|
||||||
|
lam[2] = np.array([[0,-i_,0],[i_,0,0],[0,0,0]], dtype=complex)
|
||||||
|
lam[3] = np.array([[1,0,0],[0,-1,0],[0,0,0]], dtype=complex)
|
||||||
|
lam[4] = np.array([[0,0,1],[0,0,0],[1,0,0]], dtype=complex)
|
||||||
|
lam[5] = np.array([[0,0,-i_],[0,0,0],[i_,0,0]], dtype=complex)
|
||||||
|
lam[6] = np.array([[0,0,0],[0,0,1],[0,1,0]], dtype=complex)
|
||||||
|
lam[7] = np.array([[0,0,0],[0,0,-i_],[0,i_,0]], dtype=complex)
|
||||||
|
lam[8] = (1/np.sqrt(3))*np.array([[1,0,0],[0,1,0],[0,0,-2]], dtype=complex)
|
||||||
|
|
||||||
|
# check standard normalization Tr(lam_a lam_b) = 2 delta_ab
|
||||||
|
for a in range(1,9):
|
||||||
|
for b in range(1,9):
|
||||||
|
val = np.trace(lam[a]@lam[b])
|
||||||
|
if a==b and not np.isclose(val,2):
|
||||||
|
print("WARN std norm", a,b,val)
|
||||||
|
if a!=b and not np.isclose(val,0):
|
||||||
|
print("WARN std orth", a,b,val)
|
||||||
|
|
||||||
|
sigma = [None] + [np.sqrt(3/2)*lam[k] for k in range(1,9)] # d=3 -> Tr(sigma_i sigma_j)=3 delta_ij
|
||||||
|
|
||||||
|
# sanity check
|
||||||
|
for a in range(1,9):
|
||||||
|
for b in range(1,9):
|
||||||
|
val = np.trace(sigma[a]@sigma[b]).real
|
||||||
|
expected = 3.0 if a==b else 0.0
|
||||||
|
assert abs(val-expected) < 1e-9, (a,b,val)
|
||||||
|
print("Generator normalization OK: Tr(sigma_i sigma_j) = 3 delta_ij")
|
||||||
|
|
||||||
|
# ---------- Tiles UPB (Bennett, DiVincenzo, Mor, Shor, Smolin, Terhal 1999) ----------
|
||||||
|
e0 = np.array([1,0,0], dtype=complex)
|
||||||
|
e1 = np.array([0,1,0], dtype=complex)
|
||||||
|
e2 = np.array([0,0,1], dtype=complex)
|
||||||
|
|
||||||
|
def nrm(v):
|
||||||
|
return v/np.linalg.norm(v)
|
||||||
|
|
||||||
|
psi = []
|
||||||
|
psi.append(np.kron(e0, nrm(e0-e1)))
|
||||||
|
psi.append(np.kron(e2, nrm(e1-e2)))
|
||||||
|
psi.append(np.kron(nrm(e0-e1), e2))
|
||||||
|
psi.append(np.kron(nrm(e1-e2), e0))
|
||||||
|
psi.append(np.kron(nrm(e0+e1+e2), nrm(e0+e1+e2)))
|
||||||
|
|
||||||
|
# check orthonormality
|
||||||
|
G = np.array([[np.vdot(p,q) for q in psi] for p in psi])
|
||||||
|
print("\nGram matrix of the 5 UPB vectors (should be identity):")
|
||||||
|
print(np.round(G,6))
|
||||||
|
|
||||||
|
P = sum(np.outer(p, p.conj()) for p in psi)
|
||||||
|
I9 = np.eye(9, dtype=complex)
|
||||||
|
rho = (I9 - P)/4.0
|
||||||
|
|
||||||
|
print("\nTr(rho) =", np.trace(rho).real, " (should be 1)")
|
||||||
|
print("rho is Hermitian:", np.allclose(rho, rho.conj().T))
|
||||||
|
eigvals_rho = np.linalg.eigvalsh(rho)
|
||||||
|
print("eigenvalues of rho (should be >=0, rank 4 nonzero):", np.round(eigvals_rho,5))
|
||||||
|
|
||||||
|
# ---------- PPT check ----------
|
||||||
|
def partial_transpose_B(rho, dA=3, dB=3):
|
||||||
|
r = rho.reshape(dA,dB,dA,dB)
|
||||||
|
rpt = r.transpose(0,3,2,1)
|
||||||
|
return rpt.reshape(dA*dB, dA*dB)
|
||||||
|
|
||||||
|
rho_pt = partial_transpose_B(rho)
|
||||||
|
eig_pt = np.linalg.eigvalsh(rho_pt)
|
||||||
|
print("\nEigenvalues of partial transpose (PPT check):")
|
||||||
|
print(np.round(eig_pt,6))
|
||||||
|
print("min eigenvalue of PT:", eig_pt.min(), " -> PPT" if eig_pt.min() > -1e-9 else " -> NPT (entangled via ordinary PPT already)")
|
||||||
|
|
||||||
|
# ---------- correlation tensor / shadow map ----------
|
||||||
|
T = np.zeros((8,8))
|
||||||
|
for a in range(1,9):
|
||||||
|
for b in range(1,9):
|
||||||
|
op = np.kron(sigma[a], sigma[b])
|
||||||
|
T[a-1,b-1] = np.trace(rho @ op).real
|
||||||
|
|
||||||
|
s = np.linalg.svd(T, compute_uv=False)
|
||||||
|
nuclear_T = s.sum()
|
||||||
|
dA, dB = 3, 3
|
||||||
|
norm_const = np.sqrt((dA-1)*(dB-1))
|
||||||
|
M_norm = nuclear_T / norm_const
|
||||||
|
|
||||||
|
print("\nSingular values of correlation tensor T:", np.round(s,5))
|
||||||
|
print("Nuclear norm ||T||_* =", nuclear_T)
|
||||||
|
print("Normalization constant sqrt((dA-1)(dB-1)) =", norm_const)
|
||||||
|
print("Shadow-map value ||M_A(rho)||_* =", M_norm, " (separable bound: <= 1)")
|
||||||
|
|
||||||
|
# ---------- CCNR / realignment criterion for comparison ----------
|
||||||
|
def realign(rho, dA=3, dB=3):
|
||||||
|
r = rho.reshape(dA,dB,dA,dB)
|
||||||
|
# standard realignment: R_{(i mu),(j nu)} = rho_{ij,mu nu}
|
||||||
|
R = r.transpose(0,2,1,3).reshape(dA*dA, dB*dB)
|
||||||
|
return R
|
||||||
|
|
||||||
|
R = realign(rho)
|
||||||
|
s_R = np.linalg.svd(R, compute_uv=False)
|
||||||
|
ccnr = s_R.sum()
|
||||||
|
print("\nCCNR (realignment) trace norm:", ccnr, " (separable bound: <= 1)")
|
||||||
415
uv.lock
generated
Normal file
415
uv.lock
generated
Normal file
|
|
@ -0,0 +1,415 @@
|
||||||
|
version = 1
|
||||||
|
revision = 3
|
||||||
|
requires-python = ">=3.13"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "2026-05-07-quantum-info"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = { virtual = "." }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "matplotlib" },
|
||||||
|
{ name = "qtensor" },
|
||||||
|
{ name = "sympy" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.metadata]
|
||||||
|
requires-dist = [
|
||||||
|
{ name = "matplotlib", specifier = ">=3.10.9" },
|
||||||
|
{ name = "qtensor", directory = "../qtensor" },
|
||||||
|
{ name = "sympy", specifier = ">=1.14.0" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "contourpy"
|
||||||
|
version = "1.3.3"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "numpy" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cycler"
|
||||||
|
version = "0.12.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fonttools"
|
||||||
|
version = "4.63.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0f/8d/d8fec3dcde2963f8c908fb315e5ff2cd0ac34f82394bbbf73a2aa5145ce3/fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd", size = 2876062, upload-time = "2026-05-14T12:03:32.554Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ef/71/d935dc54e4ff121bfdd11e08702db63a7e6f25af21d8a3d7b7212df53641/fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59", size = 2424594, upload-time = "2026-05-14T12:03:34.86Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d8/1f/a98a30a814b9ddef3a2e706025f90b9e0bc94890e6cb15254bc86547d11a/fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380", size = 2291313, upload-time = "2026-05-14T12:03:45.594Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/92/46/5177b01f3b4abfdd4409f31cca4ab279c9343a26efbe9ec78c97fc612e02/fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b", size = 2342299, upload-time = "2026-05-14T12:03:47.414Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745", size = 2875338, upload-time = "2026-05-14T12:03:50.052Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cd/58/7dfa0c761cb3b2964e2a84c4dc986c926a87de0cb9fb60d5b28ded3f2914/fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03", size = 2422661, upload-time = "2026-05-14T12:03:52.154Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/de/40/3ae22b60ff1d41ce0bd044b31238cdc72cef99f28b976f1e128ebd618c9b/fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616", size = 2295026, upload-time = "2026-05-14T12:04:04.47Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c3/d4/98078064ccc76b45cb0f6c002452011e93c4bd26f6850344f0951cc1fe89/fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5", size = 2347454, upload-time = "2026-05-14T12:04:06.752Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/49/4e/652d1580c5f4e39f7d103b0c793e4773129ad633dce4addd0cf4dfebde02/fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001", size = 2958152, upload-time = "2026-05-14T12:04:08.706Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0e/55/ad864c9a9b219f552eb46b32cd7906c466e5a578ba0c3abfcc0fe7413eb6/fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e", size = 2460809, upload-time = "2026-05-14T12:04:10.783Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/34/3b/214dcc19ee31d3d38fb5ad2755c11ef0514e5dc300bbaf41c0b69f393799/fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8", size = 2359326, upload-time = "2026-05-14T12:04:24.22Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/dd/1e/3ff1a9b523058c2eeb6a9d50f5574e2a738200d0d94107d5bc4105e8da3f/fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419", size = 2425829, upload-time = "2026-05-14T12:04:26.829Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "kiwisolver"
|
||||||
|
version = "1.5.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "matplotlib"
|
||||||
|
version = "3.11.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "contourpy" },
|
||||||
|
{ name = "cycler" },
|
||||||
|
{ name = "fonttools" },
|
||||||
|
{ name = "kiwisolver" },
|
||||||
|
{ name = "numpy" },
|
||||||
|
{ name = "packaging" },
|
||||||
|
{ name = "pillow" },
|
||||||
|
{ name = "pyparsing" },
|
||||||
|
{ name = "python-dateutil" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/1f/24/080c99d223d158d3a8902769269ab6da5b50f7a0e6e072513907e02b7a6c/matplotlib-3.11.0.tar.gz", hash = "sha256:68c0c7be01b30dcca3638934f7f591df73401235cbdbf0d1ab1c71e7db7f8b57", size = 33251176, upload-time = "2026-06-12T02:29:15.508Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/55/41/aa47f156b061d14c98b906f76c428507397708ec63ff94f410ae1752b426/matplotlib-3.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce3b839b34ae1f430b4616893a2945a2999debaa7e94e7e29a2a8bbf286f7b5", size = 9450532, upload-time = "2026-06-12T02:28:06.769Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8c/4f/5a9eb0375e81413953febf8af7b012a6b6357f53438a15c4f5ad86c6bbb5/matplotlib-3.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:373db8f91214e8ccaf35ac833cc1dd59dd961e148bbd55dd027141591dde1313", size = 9279760, upload-time = "2026-06-12T02:28:09.152Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a4/c0/1117d53077e3ac3152503a84e9cf7a5c239576805ee71276e80c2aaa7471/matplotlib-3.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be152b7570324dc8d01574cc9474dd2d803237acf528bcbb5b211fa347461a09", size = 10031623, upload-time = "2026-06-12T02:28:11.26Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/92/7e/e937138daffad65b71bf831a377809dcbc830fb4f31a31e067dc1faa2575/matplotlib-3.11.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:126f256df600652d7e4b394cf3164ff75210a00038f287c95a012a6f58d0e83f", size = 10839372, upload-time = "2026-06-12T02:28:14.102Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1d/c2/438ecc197ffb8023b6b9922915542f2172f5fd45b76703b0b4fc47322243/matplotlib-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:03acfeddf87b0dddb11b081ef7740ad445a3ca8bcb6b8e3011b08f2cf802b75c", size = 10924099, upload-time = "2026-06-12T02:28:16.383Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/40/2e/395883da416f378b3ed2c9f3e843ac477eae1ce731b671b79adaa6f0bacd/matplotlib-3.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:ab3722f04f3ff34c23b5012c5873d2894174e06c3822fcdac3610965a5ac7d06", size = 9329727, upload-time = "2026-06-12T02:28:18.581Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/61/82/2c388956abf8bf392dfb5b8917c502f1082df6a941b781ab8c8e5ba2474b/matplotlib-3.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:c945824670fb8915b4ac879e5e61f3c58e0913022f70a0de4c082b17372f8771", size = 9003506, upload-time = "2026-06-12T02:28:20.474Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c8/c1/34454baa44da7975ada82e9aea37105ec47059514dc967d3be14426ba8dc/matplotlib-3.11.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3489c3dc487669b4a980bc3068f87856de7a1564248d3f6c629efb2a58b03f24", size = 9499838, upload-time = "2026-06-12T02:28:22.713Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b1/c3/98fe79a398cf232219f090163a7fa7e6766e9f2e0ad26df54d6f8934d8ee/matplotlib-3.11.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6a98f5476ce784a50ce09998f4ae1e6a9f25043cef8a480c98949902eda74620", size = 9332298, upload-time = "2026-06-12T02:28:24.796Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/95/e4/b4b7c33151e74e5c802f3cde1ba807ebfc38401e329b44e215a5888dd76d/matplotlib-3.11.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:565af866fd63e4bd3f987d580afe27c44c2552a3b3305f4ecbb85133601ea6f3", size = 10045491, upload-time = "2026-06-12T02:28:27.141Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/71/28/394548efd68354110c1a1be11fe6b6e559e06d1a23da35908a0e316c55a9/matplotlib-3.11.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6b3e64dea5062c570f04358e2711859f3531b459f29516274fbad889079e4f3", size = 10857059, upload-time = "2026-06-12T02:28:29.222Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c8/44/e7922e6e2a4d63bdfbc9dc4a53e3850ab438d46cf42e6779bb15ec92c948/matplotlib-3.11.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:942b37c5db1899610bd1543ce8e13e4ecff9a4633e7f63bb6aa9205d2644ebd1", size = 10939576, upload-time = "2026-06-12T02:28:31.66Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3d/be/b1ca96003a441d619b727fee21d671fdff7a5ce2f1bb797b2521aa2f679a/matplotlib-3.11.0-cp313-cp313t-win_amd64.whl", hash = "sha256:c08e649a6313e1291e713623b97a38e5bb4aa580b2a100a94a3309bc6b9c8eb3", size = 9379519, upload-time = "2026-06-12T02:28:33.888Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e3/72/4bf3b91821c34596dd6a7bdac5836d94f744144c8208939ef49d8ec43f7e/matplotlib-3.11.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2746cd2c113742ff6ce37a864c5ac5fd7aa644568f445e66166e457ac78e40e0", size = 9055456, upload-time = "2026-06-12T02:28:35.878Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/57/52/a94102ac99eb78e2fe9b826674f9ef9ee23327110ea6ab4776c1b4eb6209/matplotlib-3.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3338e3e3de128cf50d0d2fb92a122815daf9c755bd882a474343c05f8fd7ec79", size = 9452137, upload-time = "2026-06-12T02:28:37.93Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7c/03/b8cdb625a21f710dfa11bbca1f48fb4057d2c0286975f8b415bf80942c99/matplotlib-3.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:25c2e5455efd8d99f41fb79871a31feb7d301569642e332ec58d72cfe9282bc3", size = 9281514, upload-time = "2026-06-12T02:28:40.028Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b7/2d/4e1240ea82ee197dfb3851e71f71c87eeeb975f1753b56a0588e4e80739a/matplotlib-3.11.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9695457a467ff86d23f35037a43deb6f1134dd6d3e2ac8ce1e2087cff09ffb9", size = 10843005, upload-time = "2026-06-12T02:28:42.39Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/29/dc/6377ecfaa5fef79430f74a1a16638b4e2aa30d4692bae2c19f9d76fe3b01/matplotlib-3.11.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19c16c61dea63b3582918503e6b294193961261d9daa806d4ae2151f1ad05430", size = 11127459, upload-time = "2026-06-12T02:28:44.483Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6f/41/795c405aa7560443a3b01309424cde4a1113b85c90b8a63417444a749617/matplotlib-3.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2d72ea8b7924f3cb955e61518d21e43b3df1e6c8a793b480a0c1214f185d30ba", size = 10925160, upload-time = "2026-06-12T02:28:46.564Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1a/f7/3a9e6389a7cfaeff76c56e40c2dabcb13110e21e82f837228c834ebe748c/matplotlib-3.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:1c02da0a629dfa9debf52725ea06866b74c1fb70a895bae05e4493d34074f9f2", size = 9485186, upload-time = "2026-06-12T02:28:49.344Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8b/c0/396478ee7cf2091d182db8b4a8695f6a37f1ddb978989cf9dbb84cd5c123/matplotlib-3.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:aa55d73b3117d4b07f959cd9eb6f69b375d8df3414139c479388e551aa5d999d", size = 9160349, upload-time = "2026-06-12T02:28:51.382Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c5/6f/1c3bd51bb2b34eaacdcf3c3d859dbb357f952fc8020c617dc118ad7c9e38/matplotlib-3.11.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a9d8c6e7cd2f0ddf11d8d92e520dd1d9d2abb0cf6ac8831e338666c81e905847", size = 9500921, upload-time = "2026-06-12T02:28:53.443Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e0/0d/4d861d0121840cb1a3fd4a10deb211efd6fccd481ed23e553f31f4f4da4a/matplotlib-3.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:be050fcf32f729eda99f7f75a80bf67612ce16ab9ac1c23a387dcaede95cb70e", size = 9332190, upload-time = "2026-06-12T02:28:55.623Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4b/cb/22f6bc35711a0b5639a784e74e653e77c86210bd4304449dd399a482f74e/matplotlib-3.11.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfabef0230d0697aa0d717385194dd41162e00207a68bf4abf94c2bf4c27dca0", size = 10854181, upload-time = "2026-06-12T02:28:57.856Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3f/7e/9a9eaca731a2939589da520f0ebe8fd8753d0f51fca98c7d20af6dbe261a/matplotlib-3.11.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1644db30e759199443493ac5e5caec24fdb775a8f6123021f85ba47c4133c3cb", size = 11137715, upload-time = "2026-06-12T02:29:00.555Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ef/f9/9b030b6088354acb0296871bb624b25befc1c42509d3c6cd17420c83a5b8/matplotlib-3.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15b0d160079cb10699a0e98b5989c70677b2df7cacdc62af67c30f2facec46d9", size = 10939427, upload-time = "2026-06-12T02:29:02.527Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/59/94/6b273eaee4ee250863567d100865da61a5c1527fa67f527b7ed22e0dd29c/matplotlib-3.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:446307e6b04b57b1f1239e228a1ec2af0d589a1008cebc3dfa3f5441d095cfb6", size = 9535809, upload-time = "2026-06-12T02:29:04.994Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/60/95/1d36bddf2b7e2692c1540e78a6e5bc88bc1496b137e3e35a611f91b65ac3/matplotlib-3.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:652fb5696271d4c50f196d22a5ff4f8e4444c74f847423570d7dc0aa2bbd0159", size = 9209226, upload-time = "2026-06-12T02:29:07.033Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mpmath"
|
||||||
|
version = "1.3.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "numpy"
|
||||||
|
version = "2.5.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/db/f4/731b6085a83faf6ca843394cbd5e217280c214399f7e8b21b9f552af0ae2/numpy-2.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c786fe9a5bbe360022e584c5a34cf6b54265c71bd7ec8ac3d8fec38968071f8", size = 16795063, upload-time = "2026-07-04T17:07:07.374Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32985c896d897419ef8da6917872d80b78ad0ea26d85b23245c7366ffde76d75", size = 11776652, upload-time = "2026-07-04T17:07:09.907Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b5/59/2b844c7a6e9deff69b404a66221e1542937734f65d5e6e39411876053862/numpy-2.5.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:efd736408cc97c79b9e6917338dfc8f06013b2274f992e96b1d9a81a71e2a2c2", size = 5335944, upload-time = "2026-07-04T17:07:12.227Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/86/51/9bf7cb2cabcebc9e017e4ec7e6322b378317a542c08b4cb68479c1efc716/numpy-2.5.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ab84dc6b074fa881cae55bea94cc4f68e285181ba7f32497bf7dee6b1496165b", size = 6656266, upload-time = "2026-07-04T17:07:14.368Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/83/3e/fb7615b211b82a32f44d5180a6d421b61f84d4fadd578b48ba4ac34e189f/numpy-2.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caf3e317d33d60c37986b452613f4ab51246d0691350c03d0cb4a898627f4a95", size = 15179720, upload-time = "2026-07-04T17:07:16.272Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21", size = 16664835, upload-time = "2026-07-04T17:07:19.021Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a2/2f/97d6475ee91afe2587797d09446f9d3e475ad4cb681662d824809327b75a/numpy-2.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c12afb53450fa976d4c681c50a7423729a4c51c0465ed9f32b8a9cabbc472373", size = 16539135, upload-time = "2026-07-04T17:07:22.015Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c4/5b/4db81e4ba0be7e2776b1de68c82aa862c7f8ec27e1b4927d4ae075e20678/numpy-2.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c11c405efc5ff6816d5983c96cdfa215bab3428961243af3ff59b228490438", size = 18426684, upload-time = "2026-07-04T17:07:24.941Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1f/64/c0ba2d90724d450279a7df8f32057241070250a26a7e2b5337d77347f481/numpy-2.5.1-cp314-cp314-win32.whl", hash = "sha256:f2479a47f8d5932d1718168a681ad6e536a9df484c83cfcf9de365e164537ace", size = 6116103, upload-time = "2026-07-04T17:07:27.622Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c1/1a/837f9ed7405adcd7a40538792eb169eddd8fa5630c16a1ef49dae71a30f4/numpy-2.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:24d0eb82c0541d3415a33425db64ae439dffccd7b4dbcb30e7c35120205c506a", size = 12562177, upload-time = "2026-07-04T17:07:29.887Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/22/ed/49707938b6dd0a78a9178dd93227dc89e4c11af47f5c798d70366e8d0483/numpy-2.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:5a4c988b38d261deeeaad9954e3deb091ad905c94e8bb6708654ef1d97f286b0", size = 10627739, upload-time = "2026-07-04T17:07:32.568Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a6/c7/bb4b882cfe7f299cbc8b66e42e7dd78cf9d14e40f9469fc5e3db7e15b3bd/numpy-2.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a33276be12fa045805f477f22482088b66bb758ffbe89a9d21457de863a32e22", size = 11894709, upload-time = "2026-07-04T17:07:34.941Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/40/3f/5af7f4a7f6224aef48017aa82bb6174c7a659d724be0c75017b7e64a55b4/numpy-2.5.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f089d7b00756190aacf1f5d34bdf38c3c430ac82b4f868f8cede73380460fce7", size = 5453810, upload-time = "2026-07-04T17:07:37.495Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/20/c9/3474309bc94d634d3f9c3eddf03250ecb8c22cd948ef16fef69a77cc5d7b/numpy-2.5.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:09e9bfd8d2cf479c7d174804fb3811c53a8e9f20a37444008606b57d6b7a826d", size = 6761189, upload-time = "2026-07-04T17:07:39.563Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/90/8a/558ae39fdd55d7e7f7fef9a84a6e964ac6b23edbd2a07e52bb084500507d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e68d8dd1e7eba712948f2053a29ec86917bc70ba1358df869d9f06649ef9cf09", size = 15225039, upload-time = "2026-07-04T17:07:41.682Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/63/27/ca7392b2d030277bdf0273e7d23255b3ee57d57a7c170a6f4fb3981e1e5d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d5095fa265a0c4152e7bb12759e14381ef5496152f1ce58f44bdf55c44beb4", size = 16701306, upload-time = "2026-07-04T17:07:44.611Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/02/42/03d53ae7996c44d4374a8262e9dc41671fd56cbb98f7d47ef85cf5da4c6b/numpy-2.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ab87a91b3cc3382b8956095bd8f95e00cf679bb81554339be1a2ba404a1473c1", size = 16589955, upload-time = "2026-07-04T17:07:47.694Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7b/15/6c1784ae469640e65db111e9a34b3d0f14d91e8a38b9ce34810ced370dbb/numpy-2.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:224ca51130ef7da85bea2191625181cb4f337f9cb64b471f10c1a12aa8b60077", size = 18464252, upload-time = "2026-07-04T17:07:50.684Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/94/a8/f98e50356cf167df656c526c2dfeec2d7dde182f2a3da4b458a5938e2776/numpy-2.5.1-cp314-cp314t-win32.whl", hash = "sha256:6eab239876581b2b3c5a242281b6007bbdbcd1c7085d7709bb57c5929b11e6bf", size = 6263298, upload-time = "2026-07-04T17:07:53.445Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/72/ac/96ae880cdecad0b3275d9359fcec72667b49a4863c9f12942e43679dda02/numpy-2.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:83ce9c80d5b521b0d77ddcbe5447c218d247929b6cc056ca5351342accfff0af", size = 12748623, upload-time = "2026-07-04T17:07:55.384Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a1/5a/4d2b1601df3602dba7a14f3348ba9bfe94a18adb428e693df6154c293831/numpy-2.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:5a6db61f9aaa57e369905c67d852045d3c4f7126405b29d09b19dec118e9c9cb", size = 10697674, upload-time = "2026-07-04T17:07:58.506Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "packaging"
|
||||||
|
version = "26.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pillow"
|
||||||
|
version = "12.3.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pyparsing"
|
||||||
|
version = "3.3.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "python-dateutil"
|
||||||
|
version = "2.9.0.post0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "six" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "qtensor"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = { directory = "../qtensor" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "numpy" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.metadata]
|
||||||
|
requires-dist = [{ name = "numpy", specifier = ">=2.4.4" }]
|
||||||
|
|
||||||
|
[package.metadata.requires-dev]
|
||||||
|
dev = [
|
||||||
|
{ name = "mypy", specifier = ">=2.1.0" },
|
||||||
|
{ name = "pytest", specifier = ">=9.0.3" },
|
||||||
|
{ name = "ruff", specifier = ">=0.15.12" },
|
||||||
|
]
|
||||||
|
docs = [
|
||||||
|
{ name = "mkdocs", specifier = ">=1.6.1" },
|
||||||
|
{ name = "mkdocs-material", specifier = ">=9.7.6" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "six"
|
||||||
|
version = "1.17.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sympy"
|
||||||
|
version = "1.14.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "mpmath" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" },
|
||||||
|
]
|
||||||
Loading…
Add table
Add a link
Reference in a new issue