Vad är Q#?

Slutförd

Q# är ett programmeringsspråk med öppen källkod på hög nivå för att utveckla och köra kvantalgoritmer. Det är en del av Azure Quantum Development Kit (Modern QDK) och är utformat för att vara maskinvaruagnostisk, skala till alla kvantprogram och optimera körningen.

Varför ett kvantprogrammeringsspråk?

Det finns många anledningar till att vilja skapa ett kvantprogrammeringsspråk, men det korta svaret skulle vara: eftersom vi vill skriva algoritmer, inte kretsar.

När vi skriver algoritmer bör vi uppfylla följande krav för språket, kompilatorn och körningen:

  • Abstrakta kvantbitar Kvantalgoritmer använder kvantbitar som inte är knutna till specifik maskinvara eller layout. Kompilatorn och körningen hanterar mappningen från program qubits till fysiska kvantbitar.
  • Kvantberäkning och klassisk beräkning. Möjligheten att utföra klassiska beräkningar och kvantberäkningar är viktig i en universell kvantdator.
  • Fysikens lagar Kvantalgoritmer följer kvantfysikens regler. De kan till exempel inte kopiera eller komma åt qubit-tillstånd direkt.

Egenskaperna för Q#

Q# kan användas för att skriva kvantalgoritmer, simulera dem på klassiska datorer och sedan köra dem på faktiska kvantdatorer. Q# innehåller också ett bibliotek med inbyggda kvantåtgärder, till exempel kvantgrindar och mätningar som används för att manipulera kvantbitar och utföra kvantberäkningar.

@EntryPoint()
operation MeasureOneQubit() : Result {
    // The following using block creates a fresh qubit and initializes it
    // in the |0 state.
    use qubit = Qubit();
    // We apply a Hadamard operation to the state, thereby preparing the
    // state 1 / sqrt(2) (|0> + |1>).   
    H(qubit);
    // Now we measure the qubit in Z-basis.
    let result = M(qubit);
    // As the qubit is now in an eigenstate of the measurement operator,
    // we reset the qubit before releasing it.
    if result == One { X(qubit); }
    // Finally, we return the result of the measurement.
    return result;
}

I följande avsnitt beskrivs några viktiga funktioner i Q#.

Domänspecifika bibliotek

Med Q#-biblioteken kan du köra komplexa kvantåtgärder utan att behöva utforma åtgärder på låg nivå.

  • Standardbiblioteket innehåller en uppsättning viktiga funktioner och åtgärder som kan användas när du skriver kvantprogram i Q#.
  • Det numeriska kvantbiblioteket har stöd för en mängd olika numeriska funktioner.

Qubit-hantering

I Q#är kvantbitar resurser som begärs från körningen när det behövs och returneras när de inte längre används. Den här metoden liknar hur klassiska språk hanterar heapminne.

Agnostisk kvantbitstyp

Q#-språket anger inte om kvantbitarna i programmet är logiska eller fysiska, eller vilken typ av kvantbitsteknik. Körningen bestämmer mappningen från en qubitvariabel i ett program till en faktisk logisk eller fysisk qubit. Den mappningen kan skjutas upp tills topologin och annan information om målenheten är känd.

Kompilatorgenererade kontrollerade och angränsande specialiseringar

Q# kan automatiskt göra åtgärder reversibla och kontrollerade. Den här funktionen gör det enklare att skriva algoritmer och möjliggör kompilatordriven optimering av kvantkod.

Förstklassiga åtgärder

Åtgärder och funktioner i Q# kan skickas till andra åtgärder, tilldelas till variabler och användas som andra värden. Den här funktionen gör det enkelt att uttrycka protokoll som amplitudförstärkning, fasuppskattning och andra.

Klassiskt kontrollflöde

Q# stöder allmänt klassiskt kontrollflöde under körningen av en algoritm. Den loop som krävs för probabilistiska algoritmer som Grover-sökning kan till exempel enkelt uttryckas i Q#. Med den här typen av flöde behöver du inte återgå till den klassiska drivrutinen för att testa om resultatet uppfyller oraklet och sedan köra det igen om det inte gör det.

Blandad klassisk beräkning och kvantberäkning

Q# stöder omfattande klassiska beräkningar och kvantåtgärder, vilket möjliggör rena uttryck för anpassningsbara algoritmer, till exempel uppskattningsåtgärden för slumpmässiga stegfaser. Sådana algoritmer är svåra att uttrycka direkt i kretsmodellen för en fast sekvens av kvantgrindar.