Q 샤프

Q Sharp
Q#
패러다임양자, 기능, 명령
설계자Microsoft Research(양적 아키텍처 및 계산 그룹, QuArC)
개발자마이크로소프트
첫 등장2017년 12월 11일 (2017-12-11)
타이핑 규율정적, 강력
플랫폼공용어 인프라
면허증MIT 라이선스
파일 이름 확장명.qs
웹사이트docs.microsoft.com/en-us/quantum
영향을 받은
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코드 격리를 위해
  • 모든 진술은 다음과 같이 끝난다.;
  • 구불구불한 교정기는 스코프 문장에 사용된다.
  • 단일 줄 코멘트는 다음을 사용하여 수행됨//
  • 다음과 같은 변수 데이터 유형Int Double String그리고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, 목표물));         }     } } 


참조

  1. ^ a b QuantumWriter. "The Q# Programming Language". docs.microsoft.com. Retrieved 2017-12-11.
  2. ^ a b "Announcing the Microsoft Quantum Development Kit". Retrieved 2017-12-11.
  3. ^ "Microsoft announces quantum computing programming language". Retrieved 2017-12-14.
  4. ^ 마이크로소프트, 양자 개발 키트 오픈소싱
  5. ^ QuantumWriter. "Setting up the Q# development environment". docs.microsoft.com. Retrieved 2017-12-14.
  6. ^ "Types in Q# - Microsoft Quantum". docs.microsoft.com.

외부 링크