Q 샤프
Q Sharp| 패러다임 | 양자, 기능, 명령 |
|---|---|
| 설계자 | Microsoft Research(양적 아키텍처 및 계산 그룹, QuArC) |
| 개발자 | 마이크로소프트 |
| 첫 등장 | 2017년 12월 11일 ( |
| 타이핑 규율 | 정적, 강력 |
| 플랫폼 | 공용어 인프라 |
| 면허증 | MIT 라이선스 |
| 파일 이름 확장명 | .qs |
| 웹사이트 | docs |
| 영향을 받은 | |
| C#, F#, 파이톤 | |
Q#(Q sharp로 발음)은 양자 알고리즘을 표현하는 데 사용되는 도메인별 프로그래밍 언어다.[1]그것은 처음에 마이크로소프트에 의해 양자 개발 키트의 일부로 일반에 공개되었다.[2]
역사
2017년 9월 26일 마이크로소프트 이그니트 키노트(Microsoft Ignite Keynote)에서 마이크로소프트는 양자컴퓨터에 특별히 맞춘 새로운 프로그래밍 언어를 출시할 것이라고 발표했다.[3]2017년 12월 11일 마이크로소프트는 퀀텀 개발 키트의 일부로 Q#를 출시했다.[2]
빌드 2019에서 마이크로소프트는 자사의 Q# 컴파일러와 시뮬레이터를 포함한 양자 개발 키트를 오픈소싱하고 있다고 발표했다.[4]
사용법
Q#는 Visual Studio를 위해 별도로 다운로드한 확장 기능으로 제공되지만,[5] Command line이나 Visual Studio Code에서 독립된 툴로도 실행이 가능하다.Quantum Development Kit에는 Q#가 실행 가능한 양자 시뮬레이터가 탑재되어 있다.
양자 시뮬레이터를 작동시키기 위해 또 다른 .NET 프로그래밍 언어(보통 C#)가 사용되는데, 이는 시뮬레이터를 위한 (클래식) 입력 데이터를 제공하고 (클래식) 출력 데이터를 시뮬레이터에서 읽는다.
특징들
Q#의 주요 특징은 알고리즘을 위해 쿼트를 만들고 사용하는 능력이다.그 결과 Q#의 가장 두드러진 특징으로는 토폴리 게이츠, 파울리 X, Y, Z 게이트뿐만 아니라 각각 제어된 NOT 게이트와 하다마드 게이트를 통해 쿼빗에 중첩하고 도입할 수 있는 기능 등이 있으며, 이 외에도 다양한 작업에 사용되는 여러 가지 기능들이 있다. 양자 논리 게이트에 관한 기사의 목록을 참조하라.
결국 Q#과 함께 나오게 될 하드웨어 스택은 위상학적 쿼트로 Qubits를 구현할 것으로 기대된다.오늘 퀀텀 개발 키트와 함께 출하되는 양자 시뮬레이터는 사용자 머신에서 최대 32Qbit, 아즈레에서 최대 40Qbit까지 처리할 수 있다.
문서 및 리소스
현재 Q#에 이용할 수 있는 자원은 부족하지만, 공식 문서는 Microsoft Developer Network: Q#이다.마이크로소프트 Quantum Github 저장소는 또한 다양한 Quantum 알고리즘과 그 테스트를 구현하는 샘플 프로그램들의 많은 모음입니다.
Microsoft는 또한 여기에서 코드세프코드에 대한 Quantum Coding 콘테스트: Microsoft Q# Coding Conference - Codeforce를 개최했으며, 블로그 포스트의 질문에 답하는 데 도움이 되는 관련 자료와 튜토리얼의 자세한 해결책도 제공했다.
Microsoft는 GitHub의 Q#: Microsoft/QuantumKatas와 리소스에 대한 링크 및 문제에 대한 답변을 학습하는 데 도움이 되는 일련의 학습 훈련을 진행한다.
구문
Q#는 C#와 F# 둘 다와 구문적으로 관련이 있지만, 약간의 중요한 차이점도 있다.
C#와의 유사성
- 사용하다
namespace코드 격리를 위해 - 모든 진술은 다음과 같이 끝난다.
; - 구불구불한 교정기는 스코프 문장에 사용된다.
- 단일 줄 코멘트는 다음을 사용하여 수행됨
// - 다음과 같은 변수 데이터 유형
IntDoubleString그리고Bool자본화되었지만 유사하다(그리고 Int는 64비트).[6] - Qbit는 a 내에서 할당 및 폐기된다.
using막다 - Lambda 함수:
=>교환원의 - 결과를 반환하는 방법은
return키워드
F#와의 유사성
- 변수들은 다음 중 하나를 사용하여 선언된다.
let또는mutable[1] - 1차 함수
- 를 사용하여 가져오는 모듈
open키워드 - 변수 이름 뒤에 데이터 유형이 선언됨
- 레인지 오퍼레이터
.. for … in루프를 돌다- 모든 작동/기능에는 다음이 아닌 리턴 값이 있다.
void. 대신에void, 텅 빈 투플.()반환된다. - 레코드 데이터 유형 정의(사용:
newtype키워드, 대신type).
차이점.
- 함수는 다음을 사용하여 선언된다.
function키워드 - 양자 컴퓨터에서의 연산은 다음을 사용하여 선언된다.
operation키워드 - 여러 줄 코멘트의 부족함
- 예외를 던지는 대신 주장
- 문서가 XML 기반 문서 태그 대신 마크다운에 기록됨
예
다음 소스 코드는 공식 마이크로소프트 Q# 라이브러리 저장소의 멀티플렉서다.
// 저작권 (c) Microsoft Corporation. // MIT 라이센스에 따라 라이센스 부여. 네임스페이스 마이크로소프트양자.캐논 { 개방된 마이크로소프트.양자.내재가 있는; 개방된 마이크로소프트.양자.산술; 개방된 마이크로소프트.양자.배열; 개방된 마이크로소프트.양자.진단; 개방된 마이크로소프트.양자.수학; /// # 요약 /// a를 적용하는 다중 제어 단일 군사 작전 $U$ 적용 /// n-qubit number state $\ket{j}$로 제어되는 경우 $V_j$ 단수. /// /// $U = \sum^{N-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # 입력 /// ## 유니터리제너레이터 /// 첫 번째 요소인 "Int"가 단위의 수 $N$인 튜플, /// 및 두 번째 원소 '(Int -> ()는 Adj + Ctl)'이다. ////는 $[0,N-1]$의 정수 $j$을(를) 가져가고 유니트리얼을 출력하는 함수다. /// 운영 비용 $V_j$. /// /// ## 지수 /// $n$-qubit 제어 레지스터(번호 상태: $\ket{j}$) /// 리틀엔디안 형식. /// ///## 표적 /// $V_j$이(가) 작용하는 일반 쿼비트 레지스터. /// /// # 발언 /// "message"는 다음과 같은 경우 ID 요소로 패딩된다. /// $2^n$ 미만이 지정된다.이 구현에서는 다음을 사용한다. /// $n-1$ 보조 쿼트. /// /// # 참고 자료 /// - [ *앤드류 M.차일드, 드미트리 마슬로프, 윤성남, 닐 로스, 위안수*, /// arXiv:1711.10980](https://arxiv.org/abs/1711.10980) 작전 MultiplexOperationsFromGenerator<'T>(유니터리제너레이터 : (인트, (인트 -> ('T => 구성 단위 이다 보조 + Ctl))), 색인을 달다: 리틀엔디안, 표적으로 삼다: 'T) : 구성 단위 이다 Ctl + 보조 { 하게 하다 (엔유니터리, 유니터리 기능) = 유니터리제너레이터; 하게 하다 유니터리제너레이터위드오프셋 = (엔유니터리, 0, 유니터리 기능); 만일 길이(색인을 달다!) == 0 { 실패하다 "멀티플렉스 오퍼레이션이 실패했어.인덱스 큐비트 수는 0보다 커야 한다."; } 만일 엔유니터리 > 0 { 하게 하다 보조의 = []; 조정 생성기IMpl의 멀티플렉스 작동(유니터리제너레이터위드오프셋, 보조의, 색인을 달다, 표적으로 삼다); } } /// # 요약 /// "MultiplexOperationsFromGenerator"의 실행 단계. /// # 참고 /// - Microsoft.양자.캐논.MultiplexOperationsFromGenerator 내부의 작전 생성기IMpl의 멀티플렉스 작동<'T>(유니터리제너레이터 : (인트, 인트, (인트 -> ('T => 구성 단위 이다 보조 + Ctl))), 보조의: 큐빗[], 색인을 달다: 리틀엔디안, 표적으로 삼다: 'T) : 구성 단위 { 보디 (...) { 하게 하다 n색인덱스 = 길이(색인을 달다!); 하게 하다 n스타테스 = 2^n색인덱스; 하게 하다 (엔유니터리, 유니터리오프셋, 유니터리 기능) = 유니터리제너레이터; 하게 하다 엔유니터리 레프트 = 미니(엔유니터리, n스타테스 / 2); 하게 하다 nunitariesRight = 미니(엔유니터리, n스타테스); 하게 하다 레프트유니터리 = (엔유니터리 레프트, 유니터리오프셋, 유니터리 기능); 하게 하다 우익단체 = (nunitariesRight - 엔유니터리 레프트, 유니터리오프셋 + 엔유니터리 레프트, 유니터리 기능); 하게 하다 뉴컨트롤스 = 리틀엔디안(대부분(색인을 달다!)); 만일 엔유니터리 > 0 { 만일 길이(보조의) == 1 그리고 n색인덱스 == 0 { // 종료 사례 (통제된 조정 (유니터리 기능(유니터리오프셋)))(보조의, 표적으로 삼다); } 엘리프 길이(보조의) == 0 그리고 n색인덱스 >= 1 { // 사례 시작 하게 하다 신조의 = 꼬리(색인을 달다!); 만일 nunitariesRight > 0 { 생성기IMpl의 멀티플렉스 작동(우익단체, [신조의], 뉴컨트롤스, 표적으로 삼다); } 안쪽에 { X(신조의); } 신청하다 { 생성기IMpl의 멀티플렉스 작동(레프트유니터리, [신조의], 뉴컨트롤스, 표적으로 삼다); } } 다른 { // nIndex를 1로 줄이고 Length(보조)를 1로 설정하는 재귀 하게 하다 통제를 하다 = [꼬리(색인을 달다!)] + 보조의; 사용하다 신조의 = 큐빗(); 사용하다 부도의 = 큐빗[맥시(0, 길이(통제를 하다) - 2)]; 안쪽에 { ApplyAndChain(부도의, 통제를 하다, 신조의); } 신청하다 { 만일 nunitariesRight > 0 { 생성기IMpl의 멀티플렉스 작동(우익단체, [신조의], 뉴컨트롤스, 표적으로 삼다); } 안쪽에 { (통제된 X)(보조의, 신조의); } 신청하다 { 생성기IMpl의 멀티플렉스 작동(레프트유니터리, [신조의], 뉴컨트롤스, 표적으로 삼다); } } } } } 연관을 짓다 자동차로; 통제의 (controlRegister, ...) { 생성기IMpl의 멀티플렉스 작동(유니터리제너레이터, 보조의 + controlRegister, 색인을 달다, 표적으로 삼다); } 연관을 짓다 통제의 자동차로; } /// # 요약 /// a를 적용하는 복수 제어 단일 군사 작전 $U$ 적용) /// n-qubit number state $\ket{j}$로 제어되는 경우 $V_j$ 단수. /// /// $U = \sum^{N-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # 입력 /// ## 유니터리제너레이터 /// 첫 번째 요소인 "Int"가 단위의 수 $N$인 튜플, /// 및 두 번째 원소 '(Int -> ()는 Adj + Ctl)'이다. ////는 $[0,N-1]$의 정수 $j$을(를) 가져가고 유니트리얼을 출력하는 함수다. /// 운영 비용 $V_j$. /// /// ## 지수 /// $n$-qubit 제어 레지스터(번호 상태: $\ket{j}$) /// 리틀엔디안 형식. /// ///## 표적 /// $V_j$이(가) 작용하는 일반 쿼비트 레지스터. /// /// # 발언 /// "message"는 다음과 같은 경우 ID 요소로 패딩된다. /// $2^n$ 미만이 지정된다.이 버전이 구현됨 /// n-제어 유니터리 운영자를 통해 직접 루프 방식으로. 작전 MultiplexOperationsBruteForceFromGenerator<'T>(유니터리제너레이터 : (인트, (인트 -> ('T => 구성 단위 이다 보조 + Ctl))), 색인을 달다: 리틀엔디안, 표적으로 삼다: 'T) : 구성 단위 이다 보조 + Ctl { 하게 하다 n색인덱스 = 길이(색인을 달다!); 하게 하다 n스타테스 = 2^n색인덱스; 하게 하다 (엔유니터리, 유니터리 기능) = 유니터리제너레이터; 을 위해 idxOp 에 0..미니(n스타테스,엔유니터리) - 1 { (컨트롤드온인트(idxOp, 유니터리 기능(idxOp)))(색인을 달다!, 표적으로 삼다); } } /// # 요약 /// a를 적용하는 다중 제어 단일 군사 작전 $U$ 반환 /// n-qubit number state $\ket{j}$로 제어되는 경우 $V_j$ 단수. /// /// $U = \sum^{2^n-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # 입력 /// ## 유니터리제너레이터 /// 첫 번째 요소인 "Int"가 단위의 수 $N$인 튜플, /// 및 두 번째 원소 '(Int -> ()는 Adj + Ctl)'이다. ////는 $[0,N-1]$의 정수 $j$을(를) 가져가고 유니트리얼을 출력하는 함수다. /// 운영 비용 $V_j$. /// /// # 출력 /// 단위군을 적용하는 다중 통제 단일 군사 작전 $U$ /// "유니멀티제너레이터"가 기술한다. /// /// # 참고 /// - Microsoft.양자.캐논.MultiplexOperationsFromGenerator 기능을 하다 멀티플렉서FromGenerator(유니터리제너레이터 : (인트, (인트 -> (큐빗[] => 구성 단위 이다 보조 + Ctl)))) : ((리틀엔디안, 큐빗[]) => 구성 단위 이다 보조 + Ctl) { 돌아오다 MultiplexOperationsFromGenerator(유니터리제너레이터, _, _); } /// # 요약 /// a를 적용하는 다중 제어 단일 군사 작전 $U$ 반환 /// n-qubit number state $\ket{j}$로 제어되는 경우 $V_j$ 단수. /// /// $U = \sum^{2^n-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # 입력 /// ## 유니터리제너레이터 /// 첫 번째 요소인 "Int"가 단위의 수 $N$인 튜플, /// 및 두 번째 원소 '(Int -> ()는 Adj + Ctl)'이다. ////는 $[0,N-1]$의 정수 $j$을(를) 가져가고 유니트리얼을 출력하는 함수다. /// 운영 비용 $V_j$. /// /// # 출력 /// 단위군을 적용하는 다중 통제 단일 군사 작전 $U$ /// "유니멀티제너레이터"가 기술한다. /// /// # 참고 /// - Microsoft.양자.Canon.MultiplexOperationsBruteForceFromGenerator 기능을 하다 멀티플렉서BruteForceFromGenerator(유니터리제너레이터 : (인트, (인트 -> (큐빗[] => 구성 단위 이다 보조 + Ctl)))) : ((리틀엔디안, 큐빗[]) => 구성 단위 이다 보조 + Ctl) { 돌아오다 MultiplexOperationsBruteForceFromGenerator(유니터리제너레이터, _, _); } /// # 요약 /// AND 게이트 체인 계산 /// /// # 설명 /// 임시 결과를 계산하기 위한 보조 쿼트를 명시적으로 지정해야 한다. /// 해당 레지스터의 길이는 "Length(ctrlRegister) - 2"이다. /// 두 개의 조정기, 그렇지 않으면 길이가 0이다. 내부의 작전 ApplyAndChain(등록 : 큐빗[], ctrlRegister : 큐빗[], 표적으로 삼다 : 큐빗) : 구성 단위 이다 보조 { 만일 길이(ctrlRegister) == 0 { X(표적으로 삼다); } 엘리프 길이(ctrlRegister) == 1 { CONT(머리(ctrlRegister), 표적으로 삼다); } 다른 { EqualityFacti(길이(등록), 길이(ctrlRegister) - 2, "예상치 않은 보조 쿼트 수"); 하게 하다 컨트롤1 = ctrlRegister[0..0] + 등록; 하게 하다 컨트롤2 = 쉬다(ctrlRegister); 하게 하다 목표물 = 등록 + [표적으로 삼다]; ApplyToEkelA(ApplyAnd, 지피프3(컨트롤1, 컨트롤2, 목표물)); } } }
참조
- ^ a b QuantumWriter. "The Q# Programming Language". docs.microsoft.com. Retrieved 2017-12-11.
- ^ a b "Announcing the Microsoft Quantum Development Kit". Retrieved 2017-12-11.
- ^ "Microsoft announces quantum computing programming language". Retrieved 2017-12-14.
- ^ 마이크로소프트, 양자 개발 키트 오픈소싱
- ^ QuantumWriter. "Setting up the Q# development environment". docs.microsoft.com. Retrieved 2017-12-14.
- ^ "Types in Q# - Microsoft Quantum". docs.microsoft.com.