مهندس کوانتومی

7. محاسبات عددی

7.1حساب ممیز شناور

اعداد ممیز شناور، نمایش علمی با دقت متناهی‌اند: ~۱۵-۱۶ رقم معنادار برای float64، بازهٔ نمایی ±۱۰^{±308}، و چگالی نایکنواخت (فاصلهٔ اعداد مجاور نزدیک صفر ریز، دور از صفر درشت — «رزولوشن نسبی»). پیامدهای روزمره: جمع ناأسوسیاتیو است (a + (b + c) ≠ (a + b) + c)؛ جمع اعداد کوچک با بزرگ، کوچک را می‌بلعد؛ مقایسهٔ برابری مستقیم نامعنادار است (0.1 + 0.2 == 0.3 نادرست!) — همیشه تلورانس. برای مختلط‌ها، هر عمل مؤلفه‌ای دو-bar است و خطاها همان‌جا اعمال می‌شوند. در شبیه‌سازی کوانتومی، نگرانی اصلی «رنجش نرم» است: پس از هزاران عمل، نرم حالت آرام از ۱ دور می‌کند — راه‌حل، بازنرمال‌سازی دوره‌ای و آزمون ناوردایی (Σ|α|² = 1 ± 1e−12) است.

7.2خطای عددی

دو گونه: خطای گرد شدن (هر عمل، کمی خطا) و خطای برش (الگوریتم، تقریبی است — تروتر، سریهای ناتمام). انتشار: خطاها با عمل‌ها ترکیب و رشد می‌کنند؛ نظم رشد، تفاوت الگوریتم خوب و بد است (پایداری عددی). قواعد ضدخطا برای شبیه‌سازی کوانتومی: کمترین عمل برای همان نتیجه (تغییر پایه پیش از ضرب، ضرب‌های ترکیبی)؛ بازنرمال‌سازی دوره‌ای؛ آزمون ناوردایی پس از هر مرحله (نرم، یونیتی بودن حاصل‌ضرب دروازه‌ها)؛ و مقایسهٔ مسیرهای دوگانه (کدام ساده‌لوح، کدام سریع — اختلافشان، خطای روش سریع است). هرگز خطا را «نادیده» نگیرید و هرگز از آن «وحشت» نکنید؛ اندازه‌اش بگیرید: تفاوت دو پیاده‌سازی معتبر، برآورد خطای هر دو است — تکنیکی که در پروژهٔ فصل ۱۷ دائمی می‌شود.

7.3شرط‌دهی

شرط‌NUMBER مسأله، حساسیت جواب به ورودی است: κ(A) = ‖A‖·‖A⁻¹‖ برای دستگاه‌های خطی. κ نزدیک ۱، مسألهٔ خوش‌رفتار؛ κ بزرگ، مسألهٔ بد — دادهٔ ورودی را ۱e−16 به‌هم بزنید، جواب کاملاً عوض می‌شود، فارغ از الگوریتم. تمایز حیاتی: مسألهٔ بد و الگوریتم بد، دو چیزند — الگوریتم پایدار، خطای خودش را نمی‌افزاید؛ مسألهٔ بد را هیچ الگوریتمی نجات نمی‌دهد. در کار شما: تجزیهٔ ویژهٔ ماتریس با مقدارهای ویژهٔ نزدیک، بد-شرط است (بردارهای ویژه حساس)؛ معکوس تانسورهای نزدیک به تکین (فیلترها) همین‌طور. عملی: np.linalg.cond(A) را چک کنید پیش از اعتماد به جواب؛ و در طراحی، مسائل بد-شرط را بشناسید و بازفرمول‌بندی کنید (مرکز‌زدایی، بی‌بعدسازی — همان ترفندهای عددی کلاسیک).

7.4جبر خطی عددی

جعبه‌ابزار numpy/scipy که واقعاً به‌کار می‌برید: ضرب (@ — BLAS، سریع)؛ حل دستگاه (np.linalg.solve — هرگز inv سپس ضرب)؛ کمترین مربعات (np.linalg.lstsq — برای برازش‌ها)؛ تجزیه‌ها (QR، SVD — np.linalg.svd همه‌کارهٔ ثبات: رتبه، شبه‌وارون، نزدیک‌ترین تقریب رتبه-k)؛ و ویژه (eigh برای هرمیتی — مرتب، حقیقی، پایدار؛ eig عمومی فقط وقتی مجبورید). قواعد dtype: complex128 پیوسته؛ سازندگی با dtype=complex صریح؛ upcasting بی‌صدای float→complex هنگام ضرب، کپی و کندی می‌سازد. قاعدهٔ شبیه‌سازی: هر گاه ماتریس 2ⁿ×2ⁿ کامل ساختید، علامت سؤال بگذارید — ساخت کامل فقط تا n≈۱۳ معنا دارد؛ فراتر، عمل موضعی (5.12) و روش‌های تانسوری‌اند.

7.5ماتریس‌های اسپارس

اغلب ماتریس‌های مهم، عمدتاً صفرند: هامیلتونی‌های پائولی (تعداد جمله‌های غیرصفر، خطی در n نه 4ⁿ)، عملگرهای دوقیوبیتی، گراف‌های اتصال. بازنمایی اسپارس (فقط غیرصفرها + مکانشان — scipy.sparse)، حافظه را از O(بُعد²) به O(غیرصفرها) می‌رساند و ضرب اسپارس×بردار را متناسب با غیرصفرها می‌کند. برای هامیلتونی‌های شیمی، تفاوت متراکم/اسپارس، امکان‌ناپذیر/ممکن است. در کار کوانتومی: SparsePauliOp قیسیت همین ایده را در سطح رشته‌های پائولی دارد (هامیلتونی = جمع جمله‌ها، اعمال جمله-به-جمله)؛ scipy.sparse برای ماتریس‌های کلاسیکی شما (تولید، تحلیل). قاعده: قبل از متراکم‌سازی هر ماتریس بزرگ، شمار غیرصفرها را چک کنید — اگر <۱٪، اسپارس کار کنید و ده‌ها برابر صرفه کنید.

7.6الگوریتم‌های مقدار ویژه

برای هرمیتی‌ها، انتخاب روش به اندازه و نیاز بسته است: کامل (eigh — O(d³)، تا d ~ چند هزار)؛ چند کوچک‌ترین/بزرگ‌ترین (ARNOLDI/LANCZOS اسپارس — scipy.sparse.linalg.eigsh — برای حالت پایهٔ هامیلتونی‌های بزرگ، ابزار استاندارد)؛ و تقریبی/دینامیکی (روش‌های زمان-تبلیغ، فقط دیاگونال مورد نیاز). در شبیه‌سازی کوانتومی: «پیدا کردن حالت پایه» کلاسیکی با eigsh تا n≈۲۰-۲۴ ممکن است (و مرجع اعتبارسنجی VQE شماست — فصل ۴۹)؛ فراتر، روش‌های تنسور-شبکه‌ای و خود VQE. تله‌ها: همگرایی به مقدار ویژهٔ اشتباه (خوشه‌ای) — چند بردار شروع و چک فاصله‌ها؛ و بردارهای ویژهٔ بازگردانده تا فاز — برای مقایسه، مقدار انتظاری یا فیدیلیتیِ |⟨v₁|v₂⟩|² بس است نه خودِ ضرب داخلی.

7.7بهینه‌سازی

به حداقل‌رسانی پارامترها — موتور VQE و QAOA (فصل ۴۹) و ابزار عمومی مهندسی. طبقه‌بندی: بدون گرادیان (Nelder-Mead، COBYLA — ارزان، برای ابعاد کم)؛ گرادیان-محور (BFGS و خانواده — سریع با گرادیان دقیق)؛ تصادفی/نویز-تاب (SPSA — ستون VQE سخت‌افزاری)؛ و جهانی (دیفِرنشیال-تکاملی — کند، خط پایه). برای کار شما، نکات کلیدی: همیشه چند شروع (بهینه‌سازی نانمجمع محلی است)؛ همگرایی را با نمودار تابع هزینه نظارت کنید نه فقط پیام «موفق»؛ و برای گرادیان پارامتری مدار، قاعدهٔ تغییر-پارامتر (49.3) مسیر دقیق و در دسترس است. انتخاب بهینه‌ساز بخشی از طراحی آزمایش است (49.7) — با معیار، با شواهد، نه سلیقه.

7.8مشتق‌گیری خودکار

قاعدهٔ زنجیره‌ای، ماشینی‌شده: سیستم‌های autodiff (JAX و هم‌قطارها) مشتق توابع ترکیبی را دقیق و کارا می‌گیرند — نه تقریب عددی تفاضل محدود، نه مشتق دستی مستعدخطا. دو حالت: forward-mode (برای ورودی کم، خروجی زیاد) و reverse-mode (برای ورودی زیاد، خروجی کم — «backprop»، مورد نیاز VQE با پارامترهای زیاد). برای کوانتومی‌ها: JAX با پیاده‌سازی‌های دیفرنسیل‌پذیر مدار (PennyLane الگوی مرجع است) گرادیان‌ها را از راه autodiff می‌گیرد؛ جایگزین کوانتومی-بومی، قاعدهٔ تغییر-پارامتر است (دقیق روی پارامترهای دروازه، دو ارزیابی به‌ازای هر پارامتر). عملی برای پروژه‌های کتاب: در لپ‌تاپ، تغییر-پارامتر + numpy کافی و شفاف است؛ autodiff وقتی ارزش می‌یابد که مدل ترکیبی فیزیک-شبکه داشته باشید — و دانستن هر دو، سواد است.

7.9شبیه‌سازی مونت‌کارلو

اجرا-محورِ روش‌های فصل ۶: ردیابی سیستم با رخدادهای تصادفی (نویز کانال کراوس در شبیه‌ساز شما — پروژهٔ ۶۸ — مونت‌کارلوی کوانتومی است: هر شات، یک مسیر نویز نمونه‌گیری‌شده)؛ تخمین کمیت‌ها با میانگین‌گیری روی مسیرها؛ و خطا با 1/√N. قواعد کار: seedهای مستقل و ثبت‌شده؛ N متناسب با دقت گزارش (6.10)؛ و برای رخدادهای نادر (نرخ خطای چند در هزار)، نمونه‌گیری وزن‌دار/واریانس‌کاه (importance sampling) به‌جای brute-force — تفاوت شب‌بیداری و چند دقیقه. در آزمایش‌های شیمی/نویز، «یک اجرا» هیچ‌وقت جواب نیست: توزیع روی ران‌ها (نویز، بذر، زمان) خودِ واقعیت است و گزارش باید همان باشد (فصل ۵۴).

7.10ملاحظات کارایی

چک‌لیست سریع برای کد عددی شما: dtype درست و یکنواخت (complex128، float64 — نه آرایه‌های object یا int-های ارتقایافته)؛ برداری‌سازی (عملیات آرایه‌ای به‌جای حلقه‌های پایتونی — ۱۰-۱۰۰× رایج)؛ چیدمان حافظه (C-پیوسته، برش‌های هم‌محور — np.ascontiguousarray وقتی لازم است)؛ پروفایل پیش از بهینه‌سازی (cProfile، line_profiler — شهود دربارهٔ گلوگاه تقریباً همیشه غلط است)؛ و برای عمل‌های تکراری، جلوگیری از تخصیص‌های میانی (out= در numpy). قاعدهٔ شبیه‌سازی کوانتومی: بازآرایی تانسوری (17.7) به‌جای ماتریس کامل؛ این شاخه‌های درخشان ده برابر شوند ولی اصول عمومی همین‌هاست. بهینه‌سازی بدون اندازه‌گیری، دکوراسیون است.

7.11شبیه‌سازی کلاسیک سیستم‌های کوانتومی

جمع‌بندی: کل کتاب (فصل‌های ۱۷ و ۶۴ ابزارها را کامل می‌کنند). سه رژیم: (الف) حالت-برداری — دقیق، تا n≈۳۰ (حافظه 16·2ⁿ) — مرجع حقیقت برای همه‌چیز؛ (ب) پایدارنده — مدارهای کلیفورد، هزاران کیوبیت (stim) — دنیای QEC؛ (ج) تنسور-شبکه — درهم‌تنیدگی محدود، عملاً ۵۰-۱۰۰+ کیوبیتِ کم‌عمق. انتخاب رژیم، مهارت است: منطق و درستی → (الف)؛ ساختار کلیفورد → (ب)؛ ساختار و کم‌درهم‌تنیدگی → (ج)؛ نویز → روش‌های کانال (کراوس نمونه‌ای یا ماتریس چگالی). و نکتهٔ استراتژیک که فصل ۱۷ می‌کارد: شبیه‌ساز خودساخته، بهترین معلم هر سه رژیم است — «من موتورش را نوشتم» فهم را از اجاره به مالکیت می‌برد.

7.12چرا شبیه‌سازی نمایی سخت می‌شود

پاسخ صریح، برای آخر فصل: چون حالت عمومی n کیوبیت، 2ⁿ عدد مستقل است و هیچ ساختار عمومی برای فشرده‌سازی‌اش وجود ندارد — قضیه‌گونه، نه گلایه. حالت‌های ساخت‌دار (کم‌درهم‌تنیده، کلیفورد، اسپارس) استثناها و روش‌های فصل قبل همان استثناها هستند؛ حالت عمومی (و حالت‌هایی که الگوریتم‌های جالب می‌سازند) در بدترین حالت فشرده‌ناپذیرند. پیامد مهندسی: دیوار در n≈۳۰-۵۰ (حافظه و زمان) برای روش‌های عمومی؛ این دیوار همان چیزی است که آزمایش‌های «برتری» (فصل‌های ۲۸ و ۷۷) پشتش ایستاده‌اند و همان چیزی است که راه‌های تازه (تنسور-شبکه بهینه، روش‌های نویز-ویژه) دائماً جابه‌جایش می‌کنند — مسابقه‌ای که شما در پروژهٔ فصل ۱۷ با بدنه واردش می‌شوید.