Pemodelan keterikatan kuantum dalam C #

Ketika topik keterikatan kuantum semakin banyak muncul, saya ingin melangkah lebih dalam. Dilihat oleh komentar pada artikel tentang keterikatan kuantum, informasi ini tidak akan berguna bagi saya sendiri. Nah, dengan mempertimbangkan fakta bahwa bagi sebagian besar dari kita, kode program jauh lebih nyaman daripada kiasan apa pun, diputuskan untuk menyajikan pemahaman saya dalam bentuk kode.

Artikel ini memperluas artikel penulis lain "Keterikatan Kuantum untuk Dummies" (Saya sarankan membacanya, itu banyak membantu saya). Dalam artikelnya, indomit memberikan contoh program yang dengan jelas menunjukkan masalah teori parameter tersembunyi, tetapi tidak dapat memberikan contoh kode untuk partikel dalam superposisi. Pada artikel ini, kami akan mencoba mensimulasikan 2 kasus:

  1. Bagaimana partikel-partikel terjerat berperilaku dalam determinisme, ketika keadaan partikel terbentuk sebelum pengukuran, kita tidak bisa mengukurnya tanpa memperkenalkan distorsi (teori parameter tersembunyi). Kami mendapatkan angka-angka dan melihat perbedaan dengan latihan.
  2. Kami akan menulis model partikel terjerat dalam superposisi (keadaan partikel tidak ditentukan sebelum pengukuran). Mari kita coba asumsikan bagaimana partikel diprogram di dalam, yaitu, kita akan menyesuaikan kodenya dengan data yang diperoleh secara eksperimental.

Artikel ini didasarkan pada penjelasan populer tentang fenomena keterikatan kuantum dari Mermin:

Paradox Mermin Dijelaskan
Untuk laporan populer paradoks, D. Mermin mengusulkan untuk membangun perangkat sederhana [23]. Perangkat harus terdiri dari penghasil partikel dan dua detektor. Dua partikel identik dipancarkan ke masing-masing. Setelah menangkap partikel, detektor memberikan jawaban biner (0 atau 1), tergantung pada partikel dan sakelar penyetelan tiga posisi. Mendeteksi sepasang partikel harus memberikan jawaban yang sama:

  1. Setiap kali detektor dikonfigurasikan dengan cara yang sama.
  2. Menurut statistik, dalam setengah kasus ketika mereka dikonfigurasi secara acak.

Properti pertama mengharuskan semua detektor menggunakan pengkodean yang sama, posisi sakelar adalah ∈ {1,2,3} ↦ respons ∈ {0,1}, tanpa unsur keacakan. Artinya, mereka harus menyetujui terlebih dahulu yang mana dari respon, 0 atau 1, berikan kepada posisi sakelar, memilih untuk setiap partikel satu dari delapan fungsi yang mungkin, 000, 001, 010, 011, 100, 101, 110 dan 111. Memilih 000 atau 111 akan menghasilkan hingga 100% kebetulan pembacaan detektor, terlepas dari posisi tombol kontrol. Jika detektor menerapkan salah satu dari enam fungsi yang tersisa, salah satu digit ditarik oleh sakelar yang disetel secara acak dalam 2/3 dari kasing, yang lainnya dengan probabilitas 1/3. Peluang dari kedua jawaban tersebut adalah (⅔) ² + (⅓) ² = 5/9. Jadi apa pun algoritma otomatinya, korelasinya pasti melebihi 50%, melanggar persyaratan kedua.

Tetapi karena mesin seperti itu masih dapat dibangun (misalnya, dengan memposisikan polarizer pada 120 ° seperti dalam percobaan Bohm), tidak ada determinisme (parameter) bahkan dalam bentuk tersembunyi. Alih-alih, korelasi respons dipertahankan dengan mengirimkan informasi dari satu partikel "terukur" ke partikel lain yang lebih cepat daripada pengukuran kedua.

Diambil dari sini .

Sayangnya, saya tidak melakukan fisika baik secara profesional atau bahkan pada tingkat amatir, saya tidak berpura-pura menjadi sempurna. Tujuan utama dari artikel ini adalah untuk menunjukkan bagaimana membuat model dapat dimengerti oleh mereka yang terbiasa dengan pemrograman. Jika seseorang secara profesional bekerja di bidang ini, maka alih-alih mencela, coba tulis model interaksi yang lebih akurat berdasarkan artikel saya.

[Perbarui] Penjelasan deskripsi Mermin


Meskipun beberapa bulan telah berlalu sejak penulisan artikel dan tidak ada yang akan kembali ke sana, saya memutuskan untuk membuat klarifikasi untuk menenangkan hati nurani saya.

Saya pergi sedikit lebih dalam dan sampai pada kesimpulan bahwa deskripsi menurut Mermin sangat disederhanakan dan upaya untuk menghubungkannya dengan eksperimen fisik nyata tidak ada artinya .

Awalnya, saya mencoba menghubungkan artikel itu dengan eksperimen nyata dengan polarisasi sirkular, dan saya membuat kesalahan dalam hal ini. ARad mencoba mengembangkan ikatan dengan eksperimen fisik nyata, menulis tentang kesalahan yang dibuat, dan bahkan mengusulkan versi kodenya sendiri (yang juga tidak sesuai dengan eksperimen fisik apa pun).

Agar artikel masuk akal setidaknya, diputuskan untuk menghapus semua tautan imajiner ke eksperimen fisik nyata dan cukup menjelaskan deskripsi Mermin dalam kode dan membuatnya lebih visual. Eksperimen nyata lebih rumit dan untuk mensimulasikannya Anda perlu menghabiskan lebih banyak waktu.

Dalam versi pertama artikel, kami menerima bahwa dalam percobaan pertama (posisi sensor bertepatan) partikel memberikan hasil cermin, tetapi dalam deskripsi asli menurut Mermin hasil pengukuran dengan posisi sensor yang sama selalu bertepatan. Ini sudah diperbaiki .

Selain itu, saya akan menambahkan "penjelasan untuk penjelasan" dari Mermin ini sendiri, karena tidak ditulis dengan jelas:

Artinya, mereka harus menyetujui terlebih dahulu yang mana dari respon, 0 atau 1, berikan kepada posisi sakelar, memilih untuk setiap partikel satu dari delapan fungsi yang mungkin, 000, 001, 010, 011, 100, 101, 110 dan 111.

Ungkapan "delapan fungsi yang mungkin" adalah ambigu. Delapan kemungkinan varian dampak potensial partikel pada sensor dibahas. Sensor memiliki tiga posisi (lihat uraian lengkap di atas). Jika kita percaya bahwa keadaan kedua partikel tersebut bertepatan dan diatur terlebih dahulu, maka kita dapat menentukan terlebih dahulu respons mana (0 atau 1) yang berpotensi kita terima untuk masing-masing dari tiga posisi sakelar (walaupun kita dapat "mengukur" hanya satu dari tiga opsi).

Memilih 000 atau 111 akan menghasilkan 100% cocok dengan pembacaan detektor terlepas dari posisi tombol tuning.

Jika partikel dapat mengambil nilai di mana kita berpotensi menerima respons "1" untuk setiap posisi sakelar (dan juga 0 untuk posisi sakelar mana pun), maka percobaan kedua dalam kasus ini akan memberikan 100% kebetulan. Untuk mendekati 50%, opsi ini dapat dikecualikan.

Jika detektor menerapkan salah satu dari enam fungsi yang tersisa, salah satu digit ditarik oleh sakelar yang disetel secara acak dalam 2/3 dari kasing, yang lainnya dengan probabilitas 1/3.

Ini berarti bahwa di masing-masing dari tiga kali lipat (001, 010, 011, 100, 101, 110) - hanya dua dari tiga digit yang cocok (dalam versi pertama, dua dari tiga adalah "0", dan salah satu dari ketiganya adalah "1" )

Untuk menilai probabilitas, kami menyusun tabel untuk kasus pertama 001 :

Posisi Sensor 1Posisi Sensor 2Apakah pengukuran cocok
11+
12+
13-
21+
22+
23-
31-
32-
33+

Dapat dilihat bahwa dalam lima kasus dari sembilan pengukuran bertepatan. Probabilitas yang sama akan untuk masing-masing dari enam opsi ini (setelah semua, di masing-masing dari mereka dua angka sama).

Pengukuran


Dalam masing-masing model (deterministik dan superposisi), kami akan melakukan dua percobaan dengan partikel terjerat yang sesuai dengan kondisi pertama dan kedua menurut Mermin:

  1. Pertama, atur kedua sensor pada posisi yang sama. Dalam hal ini, kita akan memperoleh hasil identik 100% (jika foton pertama melewati polarizer, maka foton yang terkait juga melewati polarizer pada sudut yang sama).
  2. Kemudian kita akan mengatur posisi sensor secara acak.

Berikut ini kode untuk percobaan pertama:

var totalAttempts = 10000; //   var coincidenceCount = 0; //    for (int attemptNumber = 1; attemptNumber <= totalAttempts; attemptNumber++) { var entanglementParticles = new EntanglementParticles(); //     var position = GetRandomInteger(1, 3); //        //            int firstSensorPosition = position; int secondSensorPosition = position; bool firstValue = entanglementParticles.First.GetValue(firstSensorPosition); //         bool secondValue = entanglementParticles.Second.GetValue(secondSensorPosition); //         if (firstValue == secondValue) //     coincidenceCount ++; } Console.WriteLine(" №1: {0}%  ", (decimal)coincidenceCount / totalAttempts * 100); //   

Berikut ini kode untuk percobaan kedua:

 var totalAttempts = 10000; //   var coincidenceCount = 0; //    for (int attemptNumber = 1; attemptNumber <= totalAttempts; attemptNumber++) { var entanglementParticles = new EntanglementParticles(); //     int firstSensorPosition = GetRandomInteger(1, 3); //      1 int secondSensorPosition = GetRandomInteger(1, 3); //      2 bool firstValue = entanglementParticles.First.GetValue(firstSensorPosition); //         bool secondValue = entanglementParticles.Second.GetValue(secondSensorPosition); //         if (firstValue == secondValue) //     coincidenceCount ++; } Console.WriteLine(" №2: {0}%  ", (decimal)coincidenceCount / totalAttempts * 100); 

Tes yang sama akan untuk semua model partikel, hanya kode partikel akan berbeda untuk model deterministik dan superposisi (lebih lanjut tentang ini di bawah).

Model deterministik


Perhatian! Lihat PEMBARUAN di akhir artikel!

Bagi mereka yang ingin segera menjalankan kode, ini dapat dilakukan dari browser: dotnetfiddle.net/N5Xg18

Jadi, menurut penjelasan Mermin, kami memiliki partikel kuantum dengan 3 parameter:

 //   ( , ) public class Particle { private bool _measured = false; public bool A { get; private set; } //       1 public bool B { get; private set; } //       2 public bool C { get; private set; } //       3 public Particle(bool a, bool b, bool c) { A = a; B = b; C = c; } //         ( 3 ). public bool GetValue(int sensorPosition) { if (_measured) throw new InvalidOperationException("    !"); _measured = true; switch (sensorPosition) { case 1: return A; case 2: return B; case 3: return C; default: throw new ArgumentOutOfRangeException(); } } } 

Karena model bersifat deterministik, semua parameter partikel diinisialisasi pada saat pembuatannya, yaitu langsung di konstruktor. Satu-satunya syarat adalah pengukuran hanya diperbolehkan sekali!

Selanjutnya Sepasang partikel terjerat:

 //    public class EntanglementParticles { public Particle First { get; private set; } //   public Particle Second { get; private set; } //   //     (   ,         ) public EntanglementParticles() { //         bool a; bool b; bool c; do { a = GetRandomBoolean(); //     1 b = GetRandomBoolean(); //     2 c = GetRandomBoolean(); ; //     3 } while (a == b && b == c); //   000  111 (    ,       ) First = new Particle(a, b, c); Second = new Particle(a, b, c); //       } } 


Dapat dilihat bahwa nilai-nilai dari masing-masing partikel diatur pada saat membuat pasangan partikel terjerat, dan parameter dari partikel kedua sesuai dengan parameter yang pertama (tanpa ini kita tidak dapat melewati tes pertama). Kami menggunakan angka acak, tetapi menurut model, parameter tergantung pada faktor-faktor pada saat kekusutan (sebagai akibat dari roulette, itu tergantung pada sejumlah faktor pada saat unwinding).

Kode contoh lengkap:

Kode C # dari model deterministik (tetap)
 using System; public class Program { private static readonly Random Random = new Random(); //   public class Particle { private bool _measured = false; public bool A { get; private set; } //       1 public bool B { get; private set; } //       2 public bool C { get; private set; } //       3 public Particle(bool a, bool b, bool c) { A = a; B = b; C = c; } //         ( 3 ). public bool GetValue(int sensorPosition) { if (_measured) throw new InvalidOperationException("    !"); _measured = true; switch (sensorPosition) { case 1: return A; case 2: return B; case 3: return C; default: throw new ArgumentOutOfRangeException(); } } } //    public class EntanglementParticles { public Particle First { get; private set; } //   public Particle Second { get; private set; } //   //     (   ,         ) public EntanglementParticles() { //         bool a; bool b; bool c; do { a = GetRandomBoolean(); //     1 b = GetRandomBoolean(); //     2 c = GetRandomBoolean();; //     3 } while (a == b && b == c); //   000  111 (   ,       ) First = new Particle(a, b, c); Second = new Particle(a, b, c); //       } } public static void Main(string[] args) { Experiment1(); Experiment2(); } private static void Experiment1() { var totalAttempts = 10000; //   var coincidenceCount = 0; //    for (int attemptNumber = 1; attemptNumber <= totalAttempts; attemptNumber++) { var entanglementParticles = new EntanglementParticles(); //     var position = GetRandomInteger(1, 3); //        //            int firstSensorPosition = position; int secondSensorPosition = position; bool firstValue = entanglementParticles.First.GetValue(firstSensorPosition); //         bool secondValue = entanglementParticles.Second.GetValue(secondSensorPosition); //         if (firstValue == secondValue) //     coincidenceCount ++; } Console.WriteLine(" №1: {0}%  ", (decimal)coincidenceCount / totalAttempts * 100); //   } private static void Experiment2() { var totalAttempts = 10000; //   var coincidenceCount = 0; //    for (int attemptNumber = 1; attemptNumber <= totalAttempts; attemptNumber++) { var entanglementParticles = new EntanglementParticles(); //     int firstSensorPosition = GetRandomInteger(1, 3); //      1 int secondSensorPosition = GetRandomInteger(1, 3); //      2 bool firstValue = entanglementParticles.First.GetValue(firstSensorPosition); //         bool secondValue = entanglementParticles.Second.GetValue(secondSensorPosition); //         if (firstValue == secondValue) //     coincidenceCount ++; } Console.WriteLine(" №2: {0}%  ", (decimal)coincidenceCount / totalAttempts * 100); } private static bool GetRandomBoolean() { return GetRandomInteger(0, 1) == 1; } private static int GetRandomInteger(int from, int to) { return Random.Next(from, to + 1); //          } } 


Anda dapat memulainya dari browser (sekali lagi tautan: dotnetfiddle.net/N5Xg18 ).

Setelah diluncurkan, inilah hasilnya:

Eksperimen No. 1: 100% dari nilai-nilai tersebut bertepatan
Eksperimen No. 2: 55.6700% dari nilai yang cocok

Tes pertama berlalu, sesuai dengan apa yang terjadi dalam kenyataan. Tetapi yang kedua - tidak cocok, karena mereka harus mendapatkan 50%!

Akibatnya, fisikawan terpaksa sampai pada kesimpulan bahwa teori parameter tersembunyi salah. Dan dengan itu, prinsip lokalitas disangkal dan prinsip kausalitas bahkan telah diguncang.

Model Superpositional


Segera tautan ke kode contoh, bagi mereka yang suka spesifik (dapat diluncurkan di browser): dotnetfiddle.net/Mb7JqU

Untuk menjelaskan hasil yang diperoleh selama percobaan, perlu untuk menggunakan model yang lebih kompleks. Dalam model modern, keadaan parameter partikel tidak ditentukan sebelum pengukuran, dan partikel yang terjerat sendiri memiliki kemampuan untuk secara instan (melebihi kecepatan cahaya) memengaruhi kondisi masing-masing. Seperti apa model partikel kita sekarang:

 //   public class Particle { private Particle _superluminalChannel; //         . private int? _measuredPosition; public bool? A { get; private set; } //       1 public bool? B { get; private set; } //       2 public bool? C { get; private set; } //       3 internal void CreateSuperluminalChannelWith(Particle particle) { _superluminalChannel = particle; } //         ( 3 ). public bool GetValue(int sensorPosition) { if (null != _measuredPosition) throw new InvalidOperationException("    !"); _measuredPosition = sensorPosition; if (null != _superluminalChannel._measuredPosition) //        { var measuredValue = _superluminalChannel.GetNakedValue(); //         (    ),   ,     . if (sensorPosition == _superluminalChannel._measuredPosition) return measuredValue; if (GetRandomInteger(1, 4) == 1) return measuredValue; return !measuredValue; } //  .        ,       -  . //   ! var value = GetRandomBoolean(); SetValue(sensorPosition, value); return value; } private bool GetNakedValue() //           ,    . { if (null == _measuredPosition) throw new InvalidOperationException(); switch (_measuredPosition.Value) { case 1: return A.Value; case 2: return B.Value; case 3: return C.Value; default: throw new InvalidOperationException(); } } private void SetValue(int position, bool value) { switch (position) { case 1: A = value; break; case 2: B = value; break; case 3: C = value; break; default: throw new ArgumentOutOfRangeException(); } } } 

Pertama, parameternya adalah Nullable (mungkin tidak masalah) dan kami tidak mengaturnya di konstruktor. Kedua, metode CreateSuperluminalChannelWith untuk mengatur saluran superlight antara partikel, yaitu Sekarang satu partikel bisa mendapatkan keadaan yang lain secara instan, terlepas dari jarak. Nah, dan yang paling penting, sekarang keadaan sebuah partikel hanya terbentuk pada saat pengukuran (memanggil metode GetValue) dan tergantung pada apakah partikel lain yang terkait dengannya diukur.

Bagian dalam metode GetValue adalah spekulasi murni. Tidak ada yang tahu bagaimana partikel diatur di dalam, tetapi kita tahu bahwa itu berfungsi seperti itu: 100% ketidakcocokan saat mengukur parameter yang sama dan 50% ketidakcocokan saat mengukur parameter dalam urutan acak.

Dalam versi kode saya, sebuah partikel melalui saluran superluminal memeriksa apakah pengukuran dibuat bingung dengan itu dan bertindak seperti ini:

  1. Jika parameter yang diukur dari partikel lain sama dengan yang kita coba ukur, itu memberikan nilai yang sama.
  2. Jika parameternya berbeda, maka dalam 1/4 dari kasus itu memberikan nilai yang sama, dan dalam 3/4 kasus itu memberikan nilai yang berlawanan (karena kita mendapatkan 50/50).

Jika pengukuran tidak dilakukan, partikel menggunakan keacakan benar untuk menetapkan nilainya, yaitu hubungan sebab akibat dilanggar (nilai tidak ada sebelum pengukuran dan pengukuran itu sendiri tidak menentukan nilainya).

Ngomong-ngomong! Anda dapat menulis ulang fungsi ini dengan cara lain, tetapi agar hasil pengujiannya sama. Semua sama, tidak ada yang tahu bagaimana partikel elementer diatur dan bagaimana 50% dicapai untuk tes kedua.

Sepasang partikel terjerat menjadi lebih mudah, karena pada saat belitan tidak ada nilai yang ditetapkan (nilai belum ditentukan):

 //    public class EntanglementParticles { public Particle First { get; private set; } //   public Particle Second { get; private set; } //   //     (  ,   ) public EntanglementParticles() { First = new Particle(); //   ,    Second = new Particle(); //   ,    //         First.CreateSuperluminalChannelWith(Second); Second.CreateSuperluminalChannelWith(First); } } 

Kode contoh lengkap:

Model superposisi dalam C #
 using System; public class Program { private static readonly Random Random = new Random(); //   public class Particle { private Particle _superluminalChannel; //         . private int? _measuredPosition; public bool? A { get; private set; } //       1 public bool? B { get; private set; } //       2 public bool? C { get; private set; } //       3 internal void CreateSuperluminalChannelWith(Particle particle) { _superluminalChannel = particle; } //         ( 3 ). public bool GetValue(int sensorPosition) { if (null != _measuredPosition) throw new InvalidOperationException("    !"); _measuredPosition = sensorPosition; if (null != _superluminalChannel._measuredPosition) //        { var measuredValue = _superluminalChannel.GetNakedValue(); //         (    ),   ,     . if (sensorPosition == _superluminalChannel._measuredPosition) return measuredValue; if (GetRandomInteger(1, 4) == 1) return measuredValue; return !measuredValue; } //  .        ,       -  . //   ! var value = GetRandomBoolean(); SetValue(sensorPosition, value); return value; } private bool GetNakedValue() //           ,    . { if (null == _measuredPosition) throw new InvalidOperationException(); switch (_measuredPosition.Value) { case 1: return A.Value; case 2: return B.Value; case 3: return C.Value; default: throw new InvalidOperationException(); } } private void SetValue(int position, bool value) { switch (position) { case 1: A = value; break; case 2: B = value; break; case 3: C = value; break; default: throw new ArgumentOutOfRangeException(); } } } //    public class EntanglementParticles { public Particle First { get; private set; } //   public Particle Second { get; private set; } //   //     (  ,   ) public EntanglementParticles() { First = new Particle(); //   ,    Second = new Particle(); //   ,    //         First.CreateSuperluminalChannelWith(Second); Second.CreateSuperluminalChannelWith(First); } } public static void Main(string[] args) { Experiment1(); Experiment2(); } private static void Experiment1() { var totalAttempts = 10000; //   var coincidenceCount = 0; //    for (int attemptNumber = 1; attemptNumber <= totalAttempts; attemptNumber++) { var entanglementParticles = new EntanglementParticles(); //     var position = GetRandomInteger(1, 3); //        //            int firstSensorPosition = position; int secondSensorPosition = position; bool firstValue = entanglementParticles.First.GetValue(firstSensorPosition); //         bool secondValue = entanglementParticles.Second.GetValue(secondSensorPosition); //         if (firstValue == secondValue) //     coincidenceCount ++; } Console.WriteLine(" №1: {0}%  ", (decimal)coincidenceCount / totalAttempts * 100); //   } private static void Experiment2() { var totalAttempts = 10000; //   var coincidenceCount = 0; //    for (int attemptNumber = 1; attemptNumber <= totalAttempts; attemptNumber++) { var entanglementParticles = new EntanglementParticles(); //     int firstSensorPosition = GetRandomInteger(1, 3); //      1 int secondSensorPosition = GetRandomInteger(1, 3); //      2 bool firstValue = entanglementParticles.First.GetValue(firstSensorPosition); //         bool secondValue = entanglementParticles.Second.GetValue(secondSensorPosition); //         if (firstValue == secondValue) //     coincidenceCount ++; } Console.WriteLine(" №2: {0}%  ", (decimal)coincidenceCount / totalAttempts * 100); } private static bool GetRandomBoolean() { return GetRandomInteger(0, 1) == 1; } private static int GetRandomInteger(int from, int to) { return Random.Next(from, to + 1); //          } } 


Hasil:

Eksperimen No. 1: 100% dari nilai-nilai tersebut bertepatan
Eksperimen No. 2: 49.7700% dari nilai-nilai tersebut bertepatan

Jalankan di browser: dotnetfiddle.net/Mb7JqU

Kesimpulan


Saya ingin lebih banyak interpretasi tersedia, seperti yang diungkapkan oleh Mermin. Berdasarkan interpretasi ini, saya berhasil membuat model visual dari teori yang ada dan bahkan mengajukan model alternatif, dan model ini tidak bersifat alegoris - Anda dapat menjalankannya dan melihat cara kerjanya.

Sayangnya, saya tidak memiliki sumber daya waktu untuk pengetahuan fisika kuantum yang lebih dalam dan saya berharap mereka yang tahu bisa mengikuti contoh saya dan memberikan model kerja yang lebih akurat.

PEMBARUAN
Penjelasan Mermin tidak lain tentang desain detektor. Atas inisiatif saya sendiri, saya menambahkan penjelasan pada A, B, dan C sebagai proyeksi putaran ke masing-masing sumbu X, Y, dan Z. Artinya, saya ingin menambahkan pengikatan ke fenomena fisik dalam komentar ke kode sehingga tidak akan terlalu kering. Dan saya salah dalam hal ini ...

Artikel ini diperbaiki dan semua upaya sia-sia untuk menghubungkan penjelasan Mermin dengan eksperimen fisik nyata dihapus.

Source: https://habr.com/ru/post/id420611/


All Articles