نحوه برنامه ریزی یک کامپیوتر کوانتومی

نحوه برنامه ریزی یک کامپیوتر کوانتومی

نحوه ساختن کشتی های جنگی از دروازه های کوانتومی NOT

تحقیقات IBM https://www.flickr.com/photos/ibm_research_zurich/16662697764/in/album-72157667479583962/

توجه به این کد 2020: مقاله اکنون بسیار قدیمی است ، اما همه ایده ها هنوز یکسان هستند.

رایانه های کوانتومی نوع جدیدی از رایانه های عجیب هستند. آنها تعداد بی شماری از جهان های موازی را برای اجرای سریعتر برنامه ها می سوزانند و از اصولی استفاده می کنند که حتی اینشتین را گیج کرده است. آنها جعبه های معجزه آسایی جادویی هستند که جعبه های احمقانه ترانزیستورهای شما را در خاک می گذارند. آنها بدون شک موفق می شوند این فناوری جدید را هیجان انگیز جلوه دهند. اما آنها همچنین می توانند محاسبات کوانتومی را مانند یک هنر معمول به نظر برسند که فقط به باهوش ترین دانشمندان سپرده شده است. مطمئناً چیزی نیست که عموم برنامه نویسان به آن توجه داشته باشند!

من فکر نمی کنم این به هیچ وجه درست باشد. و با شرکت هایی مانند IBM و Google که در حال ساخت دستگاه های کوانتومی هستند ، زمان شروع بازی با برنامه نویسی کوانتومی اکنون فرا رسیده است.

در ابتدا نیازی به انجام کارهای فانتزی ندارید. می توانید سفر خود را به برنامه نویسی کوانتومی در همان مکانی آغاز کنید که بسیاری از ما سفر خود را به برنامه نویسی عادی آغاز می کنیم: با ساخت بازی.

نگران نباشید ، داشتن رایانه کوانتومی خود مورد نیاز نخواهد بود. برنامه های کوانتومی ساده را می توان به راحتی در یک رایانه معمولی شبیه سازی کرد. ما همچنین می توانیم به لطف IBM Q Experience مدتی از یک دستگاه کوانتومی واقعی وام بگیریم.

این اولین مورد از سری مقالاتی است که در آن برخی از برنامه های ساده ساخته شده با استفاده از SDK کوانتومی IBM را شرح می دهم. هر یک نسخه ای مستقل از Battleships خواهد بود ، با فرایندهای کوانتومی ساده ای که برای پیاده سازی مکانیک اصلی بازی استفاده می شود.

اینها اولین بازی هایی هستند که برای کامپیوتر کوانتومی ساخته شده اند. من جزئیات غم انگیز کد پشت بازی را به شما نشان می دهم تا امیدوارم بتوانید آزمایش برنامه نویسی کوانتومی را نیز شروع کنید.

کامپیوتر کوانتومی چیست؟

قبل از شروع در برنامه ، ما به برخی اطلاعات پیش زمینه نیاز داریم. من همه چیز را در مورد محاسبات کوانتومی به شما نمی گویم. ما فقط به اندازه کافی برای درک آنچه در بازی ما اتفاق می افتد دریافت می کنیم.

یک رایانه معمولی بر اساس بیت ها ساخته شده است: متغیرهایی که فقط دو مقدار ممکن دارند. ما اغلب آنها را 0 و 1 می نامیم ، اگرچه در زمینه جبر بولی ممکن است آنها را درست و غلط بنامیم. مهم نیست که ما آنها را چه می نامیم. نکته مهم این است که فقط دو حالت وجود دارد.

با بیت ها می توان عملیات ساده بولی را مانند NOT ، AND و OR انجام داد. اینها اجزای اصلی محاسبات هستند. با این کارها می توانیم هر کاری را انجام دهیم. هر متغیر پیچیده تر از یک بیت (مانند int یا float) فقط مجموعه ای از تعداد زیادی بیت است. هرگونه عملیات پیچیده تر از AND یا NOT در واقع بسیاری از آنها به هم چسبیده اند. در ابتدایی ترین حالت ، این یک کامپیوتر معمولی است.

رایانه های کوانتومی بر اساس بیت های کوانتومی یا کیوبیت ها ساخته می شوند. اینها همچنین دارای دو مقدار ممکن هستند که می توان آنها را 0 و 1 نامید. اما قوانین مکانیک کوانتومی امکانات دیگری را نیز فراهم می کند ، که ما آنها را حالتهای برهم نهی می نامیم.

در برخی مواردبدیهی است ، حالات برهم نهی مقادیری هستند که تا حدی بین افراط 0 و 1 وجود دارند. ما می توانیم یک کیوبیت را به صورت یک کره ، با 0 و 1 که روی قطب های مخالف نشسته اند ، تصور کنیم. حالات برهم نهی همه نقاط احتمالی دیگر روی سطح هستند.

اقتباس از https : //commons.wikimedia.org/wiki/File: Bloch_Sphere.svg

علاوه بر 0 و 1 ، این تصویر همچنین چند حالت مهم برهم نهی را نشان می دهد. یکی u3 (0.5*pi ، 0،0) | 0⟩ نامیده می شود. مسلماً نام چندان جذابی نیست ، اما در این مقاله به معنای واقعی آن خواهیم پرداخت.

این طرز فکر در مورد کیوبیت ها آنها را کمی متغیرهای پیوسته به نظر می رساند. ما می توانیم هر نقطه ای را در سطح یک کره (مانند نقطه ψ در تصویر) با استفاده از مختصات قطبی با چند زاویه (θ و φ) نشان دهیم. بنابراین شما را ببخشند که فکر می کنید کیوبیت فقط یک جفت شناور است. به یک معنا ، آنها هستند. اما به معنای دقیق تر ، اینطور نیست.

تفاوت مهم این است که ما هرگز نمی توانیم بیش از یک اطلاعات دوتایی را از کیوبیت استخراج کنیم. قوانین فیزیک خود مانع از این می شود که بفهمیم دقیقاً چه کار می کنند. ما نمی توانیم از یک کیوبیت جزئیات دقیق وضعیت برهم نهی آن را بخواهیم. ما فقط می توانیم آن را مجبور کنیم بین دو نقطه مخالف کره (مانند 0 و 1) یکی را انتخاب کند. اگر چیزی غیر از این دو حالت باشد ، فقط باید به طور تصادفی یکی یا دیگری را تعیین کند.

بنابراین کیوبیت دارای برخی از ویژگیهای یک متغیر پیوسته و برخی از ویژگیهای یک حالت گسسته است. در حقیقت هیچ کدام نیست. این یک متغیر کوانتومی است. در این حالت ، همه کشتی ها فقط یک مربع را اشغال می کنند ، اما برخی از آنها بیشتر از بقیه غرق می شوند. ما یک کشتی خواهیم داشت که می تواند توسط یک بمب غرق شود ، یک کشتی که به دو بمب نیاز دارد و یکی به سه مورد نیاز دارد.

برای شبیه سازی این امر در یک کامپیوتر کوانتومی ، می توانیم از یک کیوبیت برای هر کشتی استفاده کنیم. حالت 0 را می توان با یک کشتی کاملاً سالم و 1 را با یک کشتی تخریب شده شناسایی کرد. حالات برهم نهی با سفر یک کشتی به سمت نابودی مطابقت دارد.

شبیه سازی یک کشتی نابود شده با یک ضربه بسیار آسان است. ما می توانیم آن را در حالت 0 مقداردهی اولیه کنیم ، و در صورت ضربه زدن یک NOT را اعمال کنیم. هنگامی که آن را در حالت 1 پیدا می کنیم ، می دانیم که از بین رفته است.

بیایید ببینیم که چگونه این فرایند ساده را بر روی یک کامپیوتر کوانتومی پیاده سازی کنیم. در حال حاضر نگران کشتی های دیگر ، ورودی و خروجی نیستیم.

برای این کار از SDK کوانتومی QISKit برای راه اندازی یک برنامه کوانتومی استفاده می کنیم. در اینجا اسکریپتی وجود دارد که یک کشتی را اولیه می کند ، آن را بمباران می کند و سپس بررسی می کند که آیا هنوز شناور است یا نه. c = ClassicalRegister (1) # مقداردهی اولیه یک ثبت با یک بیت معمولی qc = QuantumCircuit (q، c) # ایجاد وبرنامه کوانتومی خالی c [0]) # کیوبیت را اندازه بگیرید

ابتدا این مقدار تمام بیت های مورد نیاز ما را مشخص می کند: هم کوانتومی و هم معمولی. در این مثال ما یک qubit واحد را در یک ثبات به نام q تعریف کرده ایم. ما از این qubit در کد به عنوان q [0] یاد می کنیم. از آنجا که خروجی ها باید دارای اطلاعات طبیعی خوب و خواندنی برای انسان باشند ، ما همچنین یک بیت معمولی را در یک ثبات به نام c تعریف می کنیم. حالتی که می خواهیم با آن شروع کنیم ، نیازی به آمادگی بیشتر نیست.

در مرحله بعد می خواهیم این q [0] = 0 ، یک کشتی کاملاً دست نخورده را گرفته و یک NOT را انجام دهیم. با یک بیت معمولی و یک زبان برنامه نویسی معمولی ، ممکن است این را به صورت q [0] =! q [0] (برای C ++) یا q [0] = نه q [0] (برای پایتون) پیاده سازی کنیم. در QISKit می توان آن را به روش های مختلف انجام داد. ساده ترین کار این است که از عملیات به نام x و y استفاده کنید. در اینجا چند مثال از نحوه استفاده از آنها ، با خطوط معادل C ++ و Python برای مقایسه آورده شده است.

 q [0] =! q [0]؛ \\ A C ++ style NOT 
 q [0] = not q [0] # A style Python NOT 
 qc.x (q [0]) # A QISKit style NOT < /pre> 
 qc.y (q [0]) # یک سبک دیگر QISKit NOT 

تفاوتهایی بین x و y وجود دارد که باید روزی با آنها کنار بیاییم. اما امروز نه.

احتمالاً متوجه شده اید که x و y در قطعه قبلی QISKit ظاهر نمی شوند. در عوض ما u3 (pi ، 0،0) داریم. این روش دیگری برای پیاده سازی NOT است.

 qc.u3 (math.pi، 0،0، q [0]) معادل y اما u3 به طور کلی عملیات پیچیده تری است. این سه آرگومان دارد و با تغییر آنها می توانیم کارهای دیگری انجام دهیم. 

توجه داشته باشید که هنگام اجرای این عملیات در QISKit ، چهارمین آرگومان به دست می آید ، یعنی کیوبیتی که ما آن را در حال استفاده از آن هستیم.

اولین استدلال زاویه ای است که بر حسب رادیان بیان می شود. این زاویه ای است که می خواهیم با آن حوزه کیوبیت خود را بچرخانیم. زاویه pi (یا math.pi هنگام اجرا در پایتون) مربوط به 180 درجه است. این بدان معناست که ما کره را کاملاً وارونه می کنیم. 0 به 1 و 1 به 0 حرکت می کند ، به همین دلیل است که این عملیات به عنوان NOT عمل می کند. برای انجام نیمی از NOT ما می توانیم به سادگی از نیمی از این زاویه استفاده کنیم: u3 (0.5*pi ، 0،0). یک NOT دوبار.

# سبک دیگر QISKit NOT
qc.u3 (math.pi/2،0،0 ، q [0])
qc.u3 (math.pi/2،0،0 ، q [0]) 

ما همچنین می توانیم یک سوم نه سه بار ، یا یک چهارم یک NOT را با نصف NOT و سپس انجام دهیم. دو هشتم یک NOT شما ایده را می گیرید.

آخرین خط قطعه QISKit ما

 qc.measure (q [0] ، c [0]) 

در این کیوبیت را اندازه می گیریم ما به q [0] می گوییم که باید تصمیم بگیرد که چه چیزی باشد: 0 یا 1. نتیجه سپس در c [0] ذخیره می شود ، آماده است تا توسط مغزهای غیر کوانتومی ما مورد بررسی قرار گیرد یا توسط کامپیوترهای غیر کوانتومی ما پردازش شود. به سپس مقدار c [0] برابر است باخروجی این محاسبه.

اگر بین راه اندازی اولیه و اندازه گیری کاری انجام ندادیم ...

 q = QuantumRegister (1)
ج = ClassicalRegister (1)
qc = QuantumCircuit (q، c) 
 qc.measure (q [0]، c [0]) 

… نتیجه همیشه باید c [0] = 0. باشد < /p>

اگر ما NOT ...

 q = QuantumRegister (1)
ج = ClassicalRegister (1)
qc = QuantumCircuit (q، c) 
 qc.u3 (math.pi، 0،0، q [0]) 
 qc.measure (q [0]، c [ 0]) 

..نتیجه همیشه باید c [0] = 1 باشد.

اگر ما فقط نصف یک NOT ...

 q = QuantumRegister ( 1)
ج = ClassicalRegister (1)
qc = QuantumCircuit (q، c) 
 qc.u3 (0.5*math.pi، 0،0، q [0]) 
 qc.measure (q [0] ، c [0]) 

… q [0] وقتی اندازه گیری شود بین 0 تا 1 خواهد بود. در واقع این حالت برهم نهی خواهد بود که قبلاً u3 (0.5*pi ، 0،0) | 0⟩ نامیده بودیم. اندازه گیری این که آیا این 0 است یا 1 ، آن را مجبور می کند که به طور تصادفی یکی یا دیگری را با احتمالهای مساوی انتخاب کند. تصادفی اضافی نیز در دستگاه های فعلی به دلیل نویز وجود دارد. اگرچه این در سطح قابل استفاده ای پایین است ، ما هنوز باید وجود آن را در ذهن داشته باشیم. بنابراین گاهی اوقات یک عدد 1 دریافت می کنیم که باید 0 داشته باشیم و برعکس.

به این دلایل ، اجرای یک برنامه کوانتومی بارها معمول است. سپس این فرایند لیستی از تمام خروجی هایی را که در طول این نمونه های زیاد ایجاد شده اند و تعداد دفعاتی که هر کدام اتفاق افتاده است ، باز می گرداند. a NOT برای ساختن بازی روی کامپیوتر کوانتومی.

ابتدا ، من به شما یک راز می دهم. رایانه های کوانتومی همیشه دستگاههای ترکیبی ، تا حدی کوانتومی و تا حدودی معمولی خواهند بود. مورد دوم برای کنترل ورودی ها و خروجی ها به منظور ارتباط با میمون های چوبی که می خواهند از دستگاه استفاده کنند ، مورد نیاز است.

به همین دلیل ، SDK های کوانتومی معمولاً در یک زبان برنامه نویسی استاندارد تعبیه شده اند. QISKit از پایتون استفاده می کند ، بنابراین ما می توانیم از یک برنامه پایتون برای مقابله با هر دو بخش عادی برنامه و ایجاد و اجرای مشاغل برای قسمت کوانتومی استفاده کنیم.

توجه به این نکته ضروری است که همه چیز هنوز در حال تحول است. و همه ما که در این روزهای اولیه برنامه های کوانتومی می سازیم ، ناگزیر این تکامل را هدایت خواهیم کرد.

برای اجرای برنامه ، به نصب Jupyter و همچنین وابستگی های SDK نیاز دارید. در اینجا می توانید اطلاعات بیشتری کسب کنید.

qiskit-community/qiskit-community-tutorials Permalink GitHub محل زندگی بیش از 50 میلیون توسعه دهنده است که برای میزبانی و مرور کد ، مدیریت پروژه ها و… github.com

اکنون بیایید کد را بررسی کنیم!

در ابتدا ، همه چیز نیاز به اجرای کد در IBM's Quantum Experience باید وارد شود.

 از qiskit import ClassicalRegister، QuantumRegister
از qiskit import QuantumCircuit ، اجرا 

در مرحله بعد باید در API ثبت نام کنیم تا در واقع بتوانیم مشاغل را در دستگاه کوانتومی واقعی اجرا کنیم.

 از واردات qiskit register

Qconfig را وارد کنید
qx_config = {
    "APItoken": Qconfig.APItoken ،
    "url": Qconfig.config ['url']}}

register (qx_config ['APItoken']، qx_config ['url']) 

این به فایل Qconfig اشاره دارد ، که برای راه اندازی به یک حساب در IBM نیاز دارید. نگران نباشید ، رایگان است! برای مشاهده جزئیات به اینجا مراجعه کنید.

در ادامه ما مجموعه ای از توابع را طراحی می کنیم که برای کنترل همه ورودی ها و خروجی های خسته کننده طراحی شده اند. از آنجایی که این بخشی از برنامه نویسی کوانتومی نیست ، ما در این مورد به جزئیات نمی پردازیم. دستگاهی که مورد استفاده قرار می گیردبرای قسمت کوانتومی برنامه.

 device = ask_for_device ()

از qiskit import Aer ، IBMQ
تلاش کردن:
    backend = Aer.get_backend (دستگاه)
جز:
    backend = IBMQ.get_backend (device) 

تابع ask_for_device () به سادگی از پخش کننده می پرسد که از دستگاه واقعی استفاده کند یا نه. در صورت پاسخ y ، دستگاه انتخاب شده ibmq_5_tenerife است: یک پردازنده کوانتومی پنج کیوبیت واقعی در آزمایشگاه های IBM. در صورت پاسخ n ، شبیه ساز به جای آن انتخاب می شود.

نکته مهم دیگری که باید تنظیم شود تعداد دفعات اجرا شدن هر کار است. این به این دلیل است که ما از نمونه های زیادی برای محاسبه آمار در مورد خروجی های احتمالی تصادفی استفاده می کنیم.

 shots = 1024 

هیچ دلیل جادویی برای 1024 وجود ندارد. اگر می توانید آن را تغییر دهید می خواهم.

در ادامه به راه اندازی تخته ها می پردازیم ، هر بازیکن سه مکان را برای قرار دادن سه کشتی انتخاب می کند. پنج موقعیت ممکن در دسترس است که مربوط به پنج کیوبیت در دستگاه ibmqx4 IBM است. من شبکه را اینگونه تجسم می کنم

 4 0
| \ /|
| \ /|
| \ /|
| 2 |
| /\ |
| /\ |
|/\ |
3 1 

اعداد نامهایی هستند که من برای هر موقعیت استفاده می کنم. آنها همچنین نام هایی هستند که IBM استفاده می کند ، بنابراین 2 موقعیت qubit q [2] است ، برای مثال.

انتخابهای انجام شده توسط بازیکنان در shipPos ذخیره می شوند. این یک ورودی برای هر یک از دو بازیکن دارد (بازیکن = 0 برای بازیکن اول ، بازیکن = 1 برای بازیکن دوم) ، و هر یک از سه کشتی که آنها قرار می دهند. shipPos [بازیکن] [کشتی] موقعیت (0 ، 1 ، 2 ، 3 یا 4) را برای کشتی شماره گذاری شده متعلق به بازیکن متعلق به بازیکن دارد.

اکنون زمان حلقه اصلی بازی است. در این قسمت از هر دو بازیکن می پرسیم که در خط حریف خود دوست دارند کجا بمباران کنند. سپس به بمب [بازیکن] [موقعیت] اضافه می شود ، که شمارش می کند چند بار بازیکن در طول بازی موقعیت را بمباران کرده است.

ما اکنون اطلاعات کافی برای راه اندازی برنامه کوانتومی داریم. ما می دانیم که کیوبیت ها قرار است کشتی باشند و کجا را بمباران کنند. بنابراین اکنون وقت آن است که کارهای مربوطه را با QISKit تنظیم کنیم.

در هر دور ما دو برنامه کوانتومی برای اجرا خواهیم داشت: هر کدام شبیه سازی عملکرد در شبکه یک بازیکن. برای نگهداری این برنامه ها از آرایه qc استفاده می کنیم.

 qc = []
برای بازیکن در محدوده (2):
    q = QuantumRegister (5)
    ج = ClassicalRegister (5)
    qc.append (QuantumCircuit (q، c)) 

هر برنامه با یک ثبت پنج بیت کوانتومی و کلاسیک برای پوشش کل شبکه اولیه می شود. برنامه شبکه ای یک پخش کننده معین را می توان با qc [player] قرار داد ، اگرچه توجه داشته باشید که بازیکن 1 در اینجا به عنوان player = 0 و بازیکن 2 به عنوان player = 1 نامیده می شود.

حال فرض کنید ما می خواهید بخش معینی از یک NOT را در یک کیوبیت خاص اعمال کنید. ما این کار را با خط زیر انجام می دهیم

 qc [player] .u3 (frac * math.pi، 0.0، 0.0، q [position]) 

اما frac و position با اعداد واقعی.

با استفاده از این می توانیم اضافه کنیمتمام بمب هایی که بازیکن حریف به سمت این شبکه شلیک می کند. برای شبکه بازیکن ، ما هر سه موقعیتی را که کشتی وجود دارد حلقه می کنیم. سپس یک خط به qc [player] برای هر بمبی که به اینجا ارسال شده است اضافه می کنیم.

قبلاً اشاره کردم که سه کشتی در این بازی همه دارای نقاط قوت متفاوت هستند. اولین موردی که بازیکن قرار می دهد توسط یک بمب غرق می شود ، اما دومی برای از بین بردن دو مورد نیاز دارد و سومی به سه مورد نیاز دارد.

از نظر کیوبیت ، این بدان معناست که بمبی که اولین کشتی را می زند کل NOT را اعمال می کند. بمبی که به کشتی دوم برخورد می کند ، نیمی از NOT ، و بمبی در کشتی سوم یک سوم NOT را اعمال می کند. کسر کسری سپس توسط کشتی مورد اصابت قرار می گیرد. برای این کار ما به سادگی از frac = 1/(کشتی+1) استفاده می کنیم.

پس از پایان بمباران ، وقت آن است که ببینیم چه اتفاقی افتاده است. برای این کار باید دستورات اندازه گیری را اضافه کنیم. هر کیوبیت در ثبت اندازه گیری می شود و نتایج در یک بیت معمولی مربوطه کپی می شود. این کار با

 برای qubit در محدوده (5) انجام می شود:
    qc [player] t.measure (q [qubit] ، c [qubit]) 

اکنون ما یک جفت برنامه کوانتومی داریم ، زمان اجرای آنها فرا رسیده است. این کار با استفاده از

 job = execute (qc ، backend ، shots = shots) 

در اینجا هنگامی که از پخش کننده درخواست کردیم دستگاه را روی کدام دستگاه اجرا کند ، قبلاً تعریف شد.

پس از ارسال کار ، می توانیم داده ها را استخراج کنیم.

 برای پخش کننده در محدوده (2):
    grid [player] = job.result (). get_counts (qc [player]) 

در اینجا نتایج را به grid کپی می کنم ، با نتایج بمباران کشتی های بازیکنان در grid [player]. < /p>

توجه داشته باشید که فراخوانی به job.result () منتظر می ماند تا کار در واقع متوقف شود. اگر در صف پشت سر دیگران با استفاده از دستگاه هستید ، ممکن است چند دقیقه طول بکشد.

نتایج به صورت دیکشنری در شبکه [پخش کننده] ذخیره می شوند. کلیدها رشته های بیتی هستند و بنابراین چیزی شبیه 110 هستند. راست ترین بیت c [0] است و بنابراین c [0] = 0 در این مثال بیت رشته. با پردازش نتایج می توانیم بفهمیم که چند اجرا از هر نتیجه (0 یا 1) برای هر یک از بیت های معمولی بدست آمده است. خسارت برای کشتی ما ما نمی توانیم 100٪ خسارت ناشی از اثرات سر و صدا (یا آب و هوا ، در صورت تمایل به توضیح در جهان) انتظار داشته باشیم ، بنابراین ما خسارت بیش از 95٪ را به معنای غرق شدن کشتی می شماریم.

بیایید چند خروجی نمونه از فرایند کوانتومی را بررسی کنید. فرض کنید یکی از بازیکنان سومین کشتی خود را در موقعیت 2 قرار داده است. بازیکن دیگر سپس آن را بمباران می کند. نتایج شبیه به چیزی است. کشتی در واقع آسیب هایی دید. به نتایج

 {'00110': 532 ، '00010': 492} 

در اینجاهمه نتایج دارای 1 در شکاف دوم سمت راست (یکی برای موقعیت 1) است. آن کشتی با یک بمب منهدم شد. با این حال ، در موقعیت 2 فقط نیمی آسیب دیده است ، بنابراین نیمی از نتایج برای آن 1 دارد.

این نتایج خوب و تمیز بودند ، بنابراین می توان گفت که آنها روی شبیه ساز انجام شده اند. در دستگاه واقعی می توانید انتظار داشته باشید که برای کشتی هایی که حتی بمباران نشده اند و برای کیوبیت هایی که کشتی نیستند 1 نتیجه بدست آورید.

پردازش رشته های بیتی در محاسبات کوانتومی منحصر به فرد نیست. ، بنابراین من فرض نمی کنم که به شما بگویم چگونه این کار را انجام دهید. اگر به روشی که من با هم هک کردم علاقه دارید ، آن را در کد پیدا خواهید کرد.

هنگامی که درصد خسارت محاسبه شد ، به بازیکنان ارائه می شود. به عنوان مثال ، اگر فقط کشتی در موقعیت 2 مورد اصابت قرار گرفته باشد و 50٪ آسیب ببیند ، این به صورت

 نشان داده می شود؟ ؟
 | \ /|
 | \ /|
 | \ /|
 | 50٪ |
 | /\ |
 | /\ |
 |/\ |
 ؟ ؟ 

بازی همچنان درخواست بمب و اجرای سناریو را ادامه می دهد تا زمانی که یک بازیکن تمام کشتی های خود را از دست بدهد. در آن زمان بازیکن دیگر برنده می شود.

ممکن است توجه داشته باشید که بمباران کشتی سوم بازیکنان حدود 25 درصد خسارت وارد می کند. از آنجا که این کشتی یک سوم راه نابودی است ، ممکن است 33 درصد انتظار داشته باشید. دلیل آن مثلثات است. در این مرحله نیازی به پرداختن زیاد به آن نیست.

توجه به این نکته ضروری است که کل سناریو هر بار تکرار می شود. اگر زمان بین چرخش ها ممکن است فقط یک دقیقه باشد ، اما این برای کیوبیت ها تقریباً ابدی است. حتی در دمای 0.02 کلوین ، اطلاعات خیلی قبل از دور بعدی سوزانده می شد. همچنین ، نیاز ما به استخراج اطلاعات ، تمام کوانتوم دوست داشتنی را در سیستم مختل می کند. به این دلایل ، هر فرآیندی که به طور متقابل به تعامل انسان نیاز داشته باشد ، نیاز به قطعات کوانتومی دارد که از ابتدا برای هر ورودی جدید دوباره اجرا شود.

پس این تمام شد. کشتی های جنگی که بر روی کامپیوتر کوانتومی کار می کنند. نه شگفت انگیزترین استفاده از کامپیوتر کوانتومی ، و نه شگفت انگیزترین نسخه Battleships. اما برای من ، ترکیب این دو نیمی از لذت است!

در زیر می توانید به کد منبع کامل دسترسی داشته باشید.

QISKit/qiskit-tutorial qiskit -tutorial - مجموعه ای از نوت بوک های Jupyter با استفاده از Qiskitgithub.com

و در اینجا ویدئویی از بازی در حال انجام است.

داستان با نسخه دیگری از Battleships در قسمت 2 ادامه می یابد. < /p> نحوه برنامه ریزی یک کامپیوتر کوانتومی - قسمت 2 کشتی های نبرد با اندازه گیری های کوانتومیmedium.com

بهترین شرکت خودروسازی بازگشت

بهترین شرکت خودروسازی بازگشت

فورد در سال 1999 Tata Motors را مسخره کرد. در سال 2008 Tata Motors به ​​کمک فورد آمد

راتان تاتا با ماشین جگوار. Source-CarandBike

گروه تاتا یک برند خانگی در آسیا است ، زیرا شرکتی را برای تهیه کلیپ های کاغذی برای اداره یک شرکت هواپیمایی اداره می کند. این گروه در اذهان مردم آسیا اعتماد ایجاد کرده بود. داستان تاتا همه آفتاب و رنگین کمان نبود ، زیرا با توهین و شکست مواجه شد. یکی از این رویدادها…

خودروی خورشیدی-برقی استارتاپ آلمان می تواند در رانندگی آفتابی شارژ شود

خودروی خورشیدی-برقی استارتاپ آلمان می تواند در رانندگی آفتابی شارژ شود

Sono Motors در حال نهایی شدن Sion است و قصد دارد اولین خودروها را در سال آینده تولید کند و قیمت آن فقط 26،400 دلار است.

نوشته مایکل کان

استارتاپ آلمانی Sono Motors یک خودروی الکتریکی خورشیدی را به نمایش می گذارد که در هنگام رانندگی می تواند شارژ شود.

Sion شبیه یک مینی ون است ، اما قسمت بیرونی مشکی آن با 248 پنل خورشیدی پلیمری پوشانده شده است که انرژی را از خورشید جذب می کند. در نتیجه ، پنل ها می توانند خودرو را هنگام پارک کردن در خارج یا در حال حرکت شارژ کنند. در CES ، Sono Motors اولین نمونه اولیه Sion خود را معرفی کرد و برنامه داشت اولین دور تولید را سال آینده آغاز کند.

سلولهای خورشیدی روی کاپوت خودرو. (عکس: سونو)

توماس هاش ، مدیر ارشد اجرایی ، که قیمت احتمالی 26،400 دلار را پیشنهاد می کند ، می گوید: "ما Sion را مهندسی کردیم تا اولین وسیله برقی باشد که واقعاً می توانید از عهده آن برآیید.

برای دستیابی به قیمت پایین ، استارتاپ از قطعات خارج از قفسه ، از جمله موتور الکتریکی ، برای ساخت خودرو استفاده می کند. سونو همچنین قصد دارد خودرو را به صورت انحصاری از طریق فروش مستقیم آنلاین به جای نمایندگی ها بفروشد. یکی دیگر از تکنیک های کاهش هزینه شامل ادغام تولید در یک مدل است که فقط در رنگ مشکی عرضه می شود. ایستگاه شارژ. اما با استفاده از صفحات خورشیدی ، مالک می تواند ماشین خود را به مدت چهار هفته قبل از تمام شدن خودرو رانندگی کند.

"به عنوان مثال ، در آلمان ، حداکثر 35 کیلومتر برد اضافی در روز می تواند ایجاد شود صرفاً با انرژی خورشیدی (بسته به شرایط آب و هوایی) ، "این شرکت در وب سایت خود گفت. با یک بار شارژ ، Sion می تواند تا 255 کیلومتر (159 مایل) حرکت کند. این خودرو در حال حاضر برای پیش خرید در وب سایت Sono با قیمت 25،500 یورو در دسترس است و انتظار می رود اولین تحویل ها در سال 2022 انجام شود.

در ابتدا در https://www.pcmag.com منتشر شده است.

بیماری دریایی

بیماری دریایی

هفته گذشته ما با یک قایق موتوری در دریاچه واشنگتن بیرون رفتیم. دمای هوا به 93 درجه رسید و پس از آویزان شدن در دریاچه در گرمای روز ، همه ما هیجان زده بودیم که سوار قایق موتوری دوستمان آندریا شویم و کمی موهایمان را تکان دهیم. با وجود اینکه هوا بسیار گرم بود ، در دریاچه نیز متلاطم بود و به نظر می رسید که هر قایق و جت اسکی ثبت شده در منطقه سیاتل بزرگ برای یک دور دیگر حرکت می کند.

من مستعد بیماری حرکت هستم. وقتی به خارج سفر می کنیم ، من همیشه یک نسخه ضد تهوع می نویسم ، اما وقتی در دریاچه هستیم به ندرت از آن استفاده می کنم. چند هفته پیش با یک قایق بیرون رفتیم و من خوب بودم. اما هفته گذشته ، متوجه شدم که به سختی می توانم خود را نگه دارم. چند بار به داخل آب پریدم تا از ظرف گهواره ای خارج شوم. این یک راه حل موقت ارائه داد ، اما به محض اینکه سوار قایق شدم ، دریازدگی برگشت.

آندریا پیشنهاد کرد که ما را به یک تور طولانی تر ببرد ، از جنوب پارک سوورد تا پل 520. به من که نمی خواستم پوکر شوم ، موافقت کردم اما تقریباً در نیمه راه متوجه شدم که نمی توانم این کار را انجام دهم. سرم را بین زانوهایم گذاشتم ، به نانسی گفتم من یک فرد جنون زن هستم. او به آندریا گفت که با مهربانی از این تغییر برنامه لحظه آخری پیروی کرد. ما یک خط B برای ضلع غربی دریاچه ایجاد کردیم تا بتوانیم به عقب برگردیم و به سمت خلیج نزدیک خانه خود برویم.

وقتی قایق با سرعت زیاد حرکت می کرد ، خوب بودم ، اما به محض اینکه سرعت را کم کردیم. برای بسته بندی وسایل و آماده شدن برای اسکله ، بیماری دریایی در موجی خشمگین بازگشت. آندریا به او پیشنهاد کرد که قایق را کم کم بیاورد تا من بتوانم 50 یارد را تا ساحل شنا کنم. با ناامیدی برای فرار از حالت تهوع ، در فرصت پریدم. من قبلاً این پروتکل را دنبال کرده ام. چند سال پیش وقتی من و نانسی در بلیز قایقرانی می کردیم ، مجبور شدم ماموریت خود را لغو کنم و آخرین سفر خود را شنا کنم ، زیرا تکان خوردن امواج دریا در زیر کایاک برای من زیاد بود.

هنوز بسیار دلگیر ، از دماغ قایق به دریاچه پریدم. امواج بزرگ بود ، شکم من بیرون بود و کف دریاچه در نزدیکی انگشتان پای من نبود. وحشت کردم. با وجود اینکه بیش از 15 سال شناگر رقابتی بودم ، اما اغلب مهارت های خود را در آب های آزاد فراموش می کنم و آرامش خود را از دست می دهم. پشتم را برگرداندم و آب را زیر پا گذاشتم. سعی کردم جرعه های کوچکی از هوا را بنوشم ، اما نتوانستم یک نفس کامل بکشم. من خوب نبودم "لورا ، حالت خوبه؟ !!!" نانسی از قایق داد زد. من نمی خواستم لوسیا را که درست پشت نانسی ایستاده بود بترسانم ، با یک حرکت صورت نشان دادم که نه ، من خوب نیستم. من به معنای واقعی کلمه بالای سرم بودم. نمی دانستم چگونه کنترل را به دست آورم. من به کمک نیاز داشتم.

نانسی برای من یک نجات دهنده پرتاب کرد. من موفق شدم دعوا کنمروی بدنم قرار گرفت و من سگ را با دست و پا به ساحل رساندم. وقتی از دیوار بیرون می آمدم ، می توانستم افرادی را ببینم که روی حوله ، روی تخته های دست و پا نشسته اند ، در قایق ها به من نگاه می کنند و از خود می پرسند که آیا حال من خوب است یا نه ، سعی می کنم بفهمم این زن از قایق چه می کند و به چه چیزی نیاز دارد. یک نجات دهنده همه چیز در مورد آن بود اهمیتی ندادم من به آسانی از خیال راحت در خشکی راحت شدم.

در روزهای جوانی ام ، برای نشان دادن چنین ضعف ، چنین آسیب پذیری ، از خجالت می مردم. من ممکن است به نحوی سعی کرده باشم از تهوعم جلوگیری کنم یا وحشتم را نادیده بگیرم ، اما این روزها من بزرگتر و عاقل تر هستم. من می دانم که تا آنجا که می توانم تلاش می کنم ، من شکست ناپذیر نیستم. من انسانی هستم با ضعف ، ترس و محدودیت. و زندگی تحت کنترل من نیست شرایط آن روز در دریاچه من را به زانو در آورد و من به کمک احتیاج داشتم. تنها راه مراقبت از خود ، در قایق و دریاچه ، اعتراف به نقاط ضعف من ، درخواست کمک بود.

من در برابر نشان دادن نقاط ضعف خود مقاومت نمی کنم. دوست دارم تحت کنترل باشم. من اغلب خود را در درگیری می بینم زیرا نمی توانم فقط اعتراف کنم که می ترسم ، صدمه دیده ام یا تحت فشار قرار گرفته ام. بعید است ، اما ممکن است اگر آن روز در دریاچه کمک نمی خواستم غرق شوم. این یکی از کنایه های بزرگ زندگی است که اعتراف به نقاط ضعف ما را قوی تر می کند. این ما را به دیگران نزدیک می کند زیرا ما به طور کامل ، آسیب پذیری ها و همه چیز را نشان می دهیم. تجربه در دریاچه یک هدیه بود ، یک یادآوری که درخواست کمک چیز خوبی است ، بخشی ضروری از زندگی است.

سفر روزانه: 5 آوریل

سفر روزانه: 5 آوریل

بناها ، روندهای حرکتی و استقامت لحظه ای

توسط Horacio_Fernandez ، CC BY 3.0 ، https://commons.wikimedia.org/w/index.php؟curid=57756664

گنجینه

با حرکت در جنوب اقیانوس آرام در سال 1722 ، ژاکوب روگفین هلندی جزیره ای را در نیمه راه بین تاهیتی و ساحل شیلی با بیش از 800 مجسمه سنگی با ارتفاع 2 متر یا 6.5 پا تا 10 متر ارتفاع کشف می کند. جزیره ایستر همانطور که برای زمان سال Roggeveen's نامگذاری شد ...