Add first QC experiments.
Bell states in the Microsoft Quantum SDK and Rigetti's pyQuil.
This commit is contained in:
parent
6ad979d28f
commit
c633b08cbd
|
@ -49,3 +49,7 @@ bitwise/ion/ion
|
|||
|
||||
# django db
|
||||
/django/*/db.sqlite3
|
||||
|
||||
# Quantum experiments
|
||||
/qc/msqdk/*/obj
|
||||
/qc/msqdk/*/bin
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Quantum.Canon" Version="0.2.1802.1603-preview" />
|
||||
<PackageReference Include="Microsoft.Quantum.Development.Kit" Version="0.2.1802.1603-preview" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -0,0 +1,52 @@
|
|||
namespace Quantum.Bell
|
||||
{
|
||||
open Microsoft.Quantum.Canon;
|
||||
open Microsoft.Quantum.Primitive;
|
||||
|
||||
operation Set (desired: Result, q1: Qubit) : ()
|
||||
{
|
||||
body
|
||||
{
|
||||
let current = M(q1);
|
||||
|
||||
if (desired != current) {
|
||||
X(q1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
operation BellTest (count: Int, initial: Result) : (Int, Int, Int)
|
||||
{
|
||||
body {
|
||||
mutable numOnes = 0; // by default in Q#, variables are immutable.
|
||||
// Q# doesn't require type annotations for variables.
|
||||
mutable agree = 0;
|
||||
|
||||
// using allocates an array of qubits for use in a block of code.
|
||||
// all qubits are dynamically allocated and released.
|
||||
using (qubits = Qubit[2])
|
||||
{
|
||||
for (test in 1..count) {
|
||||
Set(initial, qubits[0]);
|
||||
Set(Zero, qubits[1]);
|
||||
|
||||
H(qubits[0]);
|
||||
CNOT(qubits[0], qubits[1]);
|
||||
let res = M(qubits[0]);
|
||||
|
||||
if (res == M(qubits[1])) {
|
||||
set agree = agree + 1;
|
||||
}
|
||||
|
||||
// Count the number of ones we've seen.
|
||||
if (res == One) {
|
||||
set numOnes = numOnes + 1;
|
||||
}
|
||||
Set(Zero, qubits[0]);
|
||||
Set(Zero, qubits[1]);
|
||||
}
|
||||
}
|
||||
return (count-numOnes, numOnes, agree);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
using Microsoft.Quantum.Simulation.Core;
|
||||
using Microsoft.Quantum.Simulation.Simulators;
|
||||
|
||||
namespace Quantum.Bell
|
||||
{
|
||||
class Driver
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
using (var sim = new QuantumSimulator()) {
|
||||
// Try initial values.
|
||||
Result[] initials = new Result[] { Result.Zero, Result.One };
|
||||
foreach (Result initial in initials) {
|
||||
var res = BellTest.Run(sim, 1000, initial).Result;
|
||||
var (numZeroes, numOnes, agree) = res;
|
||||
System.Console.WriteLine($"Init:{initial,-4} |0>={numZeroes,-4}, |1>={numOnes,-4}, agree={agree,-4}");
|
||||
}
|
||||
}
|
||||
System.Console.WriteLine("Press any key to continue.");
|
||||
System.Console.ReadKey();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
MSQDK
|
||||
-----
|
||||
|
||||
Experiments with the Microsoft Quantum SDK.
|
|
@ -0,0 +1,35 @@
|
|||
#!/usr/bin/env python3
|
||||
# bell.py tries to run the same Bell state program demonstrating simple
|
||||
# entanglement of qubits.
|
||||
from pyquil.quil import Program
|
||||
from pyquil.api import QVMConnection
|
||||
from pyquil.gates import CNOT, H
|
||||
|
||||
def main():
|
||||
qvm = QVMConnection()
|
||||
|
||||
print('Constructing program.')
|
||||
p = Program()
|
||||
p.inst(H(0)).inst(CNOT(0, 1)).measure(0, 0).measure(1, 1)
|
||||
print('Constructed program:')
|
||||
print('--------------------')
|
||||
print(p)
|
||||
print('--------------------')
|
||||
|
||||
print('\nRunning program on simulator.')
|
||||
results = qvm.run(p, trials=1000)
|
||||
|
||||
stats = {0: 0, 1: 0, 'agreement': 0}
|
||||
for result in results:
|
||||
if result[0] == 0:
|
||||
stats[0] += 1
|
||||
if result[0] == 1:
|
||||
stats[1] += 1
|
||||
if result[0] == result[1]:
|
||||
stats['agreement'] += 1
|
||||
|
||||
print('Results: |0>: {:d} |1>: {:d} agree: {:d}'.format(
|
||||
stats[0], stats[1], stats['agreement']))
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in New Issue