Làm thế nào tôi có thể thực hiện lời tiên tri lượng tử trong thuật toán của Đức?


13

Tôi đang cố gắng mô phỏng thuật toán của tiếng Đức (trường hợp cơ bản của thuật toán tiếng Đức-Josza) và tôi không hoàn toàn chắc chắn về cách tôi sẽ thực hiện thuật toán lượng tử cần thiết để thuật toán hoạt động, mà không đánh bại mục đích của thuật toán và "tìm kiếm" tại chức năng nhập vào là gì, bằng cách đánh giá chức năng.


Điều này có thể hữu ích: quantumcomputing.stackexchange.com/a/2262/2645
meowzz

Tại sao không chọn nó một cách ngẫu nhiên mỗi khi bạn chạy thử nghiệm? Bằng cách đó bạn không thể biết.
DaftWullie

@DaftWullie Bạn đang đề cập đến việc chọn một hàm ngẫu nhiên trong mỗi mô phỏng? Vấn đề vẫn còn phát sinh là máy tính phải biết đầu ra của hàm nhập là gì, để tạo ra hàm cần thiết, thông qua một nhà tiên tri lượng tử.
Jack Ceroni

Đúng, máy tính cần phải biết, nhưng bạn có thể bản địa hóa nó thành một hàm duy nhất lấy đầu vào là trạng thái lượng tử và đưa ra trạng thái lượng tử làm đầu ra. Chỉ có chức năng đó sẽ biết nó (và một cái gì đó phải biết nó). Hơn nữa, nếu lựa chọn ngẫu nhiên là cục bộ của chức năng đó và khác nhau mỗi lần nó được gọi, thì điều đó sẽ phù hợp với thực tế là nó chỉ nên được gọi một lần.
DaftWullie

@DaftWullie Nếu bạn tính một thuộc tính của hàm ngẫu nhiên, tại sao không ngay lập tức tạo ra một đầu ra ngẫu nhiên?
Norbert Schuch

Câu trả lời:


9

Có hai câu hỏi ở đây. Người đầu tiên hỏi làm thế nào bạn thực sự có thể thực hiện điều này trong mã, và câu hỏi thứ hai là điểm nào nếu bạn biết bạn đang đi qua nhà tiên tri nào.

Thực hiện

Có lẽ cách tốt nhất là tạo ra một hàm IsBlackBoxConstantlấy lời tiên tri làm đầu vào, sau đó chạy chương trình tiếng Đức để xác định xem nó có phải là hằng số hay không. Bạn có thể chọn nhà tiên tri một cách ngẫu nhiên, nếu bạn muốn. Đây là, được thực hiện trong Q #:

operation IsBlackBoxConstant(blackBox: ((Qubit, Qubit) => ())) : (Bool)
{
    body
    {
        mutable inputResult = Zero;
        mutable outputResult = Zero;

        // Allocate two qbits
        using (qbits = Qubit[2])
        {
            // Label qbits as inputs and outputs
            let input = qbits[0];
            let output = qbits[1];

            // Pre-processing
            X(input);
            X(output);
            H(input);
            H(output);

            // Send qbits into black box
            blackBox(input, output);

            // Post-processing
            H(input);
            H(output);

            // Measure both qbits
            set inputResult = M(input);
            set outputResult = M(output);

            // Clear qbits before release
            ResetAll(qbits);
        }

        // If input qbit is 1, then black box is constant; if 0, is variable
        return One == inputResult;
    }
}

Vấn đề ở đây là gì?

Độ phức tạp truy vấn

Độ phức tạp tính toán là một lĩnh vực liên quan đến việc phân loại các thuật toán theo số lượng tài nguyên mà chúng tiêu thụ như một hàm của kích thước đầu vào. Các tài nguyên này bao gồm thời gian (được đo bằng các bước / hướng dẫn), bộ nhớ và cũng có thứ gọi là độ phức tạp truy vấn . Độ phức tạp của truy vấn liên quan đến số lần thuật toán phải truy vấn hàm orory hộp đen.

Vấn đề tiên tri tiếng Đức rất thú vị đối với các nhà lý thuyết phức tạp vì thuật toán lượng tử chỉ phải truy vấn hộp đen một lần, nhưng thuật toán cổ điển phải truy vấn nó hai lần. Với bài toán tiếng Đức-Josza tổng quát trong đó một nhà tiên tri n -bit chứa hàm không đổi hoặc cân bằng, thuật toán lượng tử một lần nữa chỉ phải truy vấn nó một lần nhưng thuật toán cổ điển (xác định) yêu cầu 2n1 truy vấn.

Cần lưu ý rằng tồn tại thuật toán cổ điển xác suất giải quyết vấn đề tiếng Đức-Josza trong ít hơn 2n1 truy vấn bằng cách lấy mẫu ngẫu nhiên các đầu vào orory : nếu nhà tiên tri tiếp tục xuất ra cùng một giá trị bất kể đầu vào, xác suất xảy ra nhà tiên tri không ngừng phát triển rất nhanh. Điều này có nghĩa là tiếng Đức-Josza không phải là ứng cử viên sáng giá cho vấn đề ưu thế / ưu thế lượng tử, dẫn đến ...

Các ứng dụng trong thế giới thực

Nếu bạn không phải là một nhà lý thuyết phức tạp, bạn có thể không quan tâm lắm đến sự phức tạp của truy vấn và thay vào đó muốn biết tại sao vấn đề tiên tri của Đức lại quan trọng trong một thế giới "không có quy tắc" nơi bạn được phép nhìn vào bên trong hộp đen. Cố gắng phân tích một vấn đề tiên tri là một vấn đề phi tiên tri gặp nhiều khó khăn và tôi không tin có ai đã giải được câu hỏi về thuật toán cổ điển tốt nhất cho vấn đề tiên tri khi bạn được phép phân tích mạch tiên tri. Bạn có thể nghĩ - có gì để phân tích? Chỉ có bốn mạch có thể! Trong thực tế, nó phức tạp hơn nhiều.

Nếu chúng ta nhìn vào đại diện đơn giản nhất của Đức Oracle một bit, việc xây dựng cổng như sau:

Danh tính: C1,0

X0C1,0

I4

X0

Tuy nhiên, đây không phải là cách duy nhất để thực hiện các lời tiên tri. Tất cả những thứ này có thể được viết lại bằng cách sử dụng hàng trăm, hàng ngàn, thậm chí hàng triệu cổng logic! Tất cả những gì quan trọng là hiệu ứng tích lũy của các cổng logic này tương đương với việc xây dựng đơn giản ở trên. Hãy xem xét việc thực hiện thay thế sau đây của Constant-1:

H0Z0H0

Nó chỉ ra rằng, đối với bất kỳ đầu vào nào bạn có thể cung cấp:

H0Z0H0|ψ=X0|ψ

H0Z0H0X0

H0Z0H0=[12121212][1001][12121212]=[0110]=X0

Vì vậy chúng tôi có:

(H0(Z0(H0|ψ)))=(((H0Z0)H0)|ψ)=X0|ψ

H0Z0H0X0

Quan trọng vì lý do lịch sử & sư phạm

Chủ yếu, vấn đề tiếng Đức của Oracle rất quan trọng vì lý do lịch sử và sư phạm. Đây là thuật toán đầu tiên được dạy cho sinh viên bởi vì nó đơn giản nhất và dường như chứng minh tốc độ lượng tử miễn là bạn không hỏi quá nhiều câu hỏi. Nó cũng đóng vai trò là điểm khởi đầu tốt để tìm hiểu Bài toán định kỳ của Simon và sau đó là Thuật toán của Shor.


Tôi đã ở bên bạn cho đến khi điều Gotteman-Knill. Tại sao bạn hạn chế mạch phức tạp của mình ở (i) cổng một qubit và (ii) cổng ổn định?
Norbert Schuch

Theo tôi hiểu, có những thuật toán hiệu quả để xác định xem một mạch lượng tử tùy ý có thực hiện một trong một số mạch cổ điển đơn giản hay không. Các mạch ngẫu nhiên đang được nghiên cứu cho lợi thế lượng tử đòi hỏi hành vi phức tạp hơn.
ahelwer

Tôi không nghĩ điều này là đúng. Nếu tôi không nhầm, hỏi nếu hai mạch làm điều tương tự là hoàn thành QMA. Đó chỉ là hạn chế của bạn đối với cổng Clifford cho phép khả năng mô phỏng thông qua Gottesman-Knill.
Norbert Schuch

Bạn đã đúng, tôi sẽ nghiên cứu thêm về điều giảm mạch sau đó cập nhật bài viết của tôi để làm rõ vai trò của Gottesman-Knill.
ahelwer

Tôi đã cập nhật câu trả lời của mình sau khi hỏi Robin Kothari một số câu hỏi qua email.
ahelwer

3

Không có cách nào để xây dựng nhà tiên tri theo cách không đánh bại điểm của thuật toán của Đức - đó là lý do tại sao nó là một thuật toán dựa trên nhà tiên tri.

xf(x)f(0)=f(1)

f(x)1xNf(x)yf(x+y)=f(x)f(x)

Vì vậy, vấn đề là các thuật toán dựa trên orory chứng minh rằng bạn có thể tăng tốc nếu bạn gặp vấn đề với cấu trúc đó (nghĩa là bạn chỉ muốn tìm hiểu một số thuộc tính cụ thể của hàm), nhưng nó không cho bạn biết một vấn đề như vậy tồn tại

Vì vậy, nếu bạn muốn thực hiện tiếng Đức, bất kỳ cách nào để thực hiện lời tiên tri đều ổn - đó là thuật toán "bằng chứng nguyên tắc" và không mang lại sự tăng tốc thực sự cho một vấn đề thực sự (ít nhất là chúng tôi không biết).



2

Tôi không có ví dụ nào cho thuật toán của tiếng Đức tiện dụng, nhưng đâyđây là hai hướng dẫn hướng dẫn bạn thực hiện thuật toán tiếng Đức-Jozsa và các phép lạ mà nó sử dụng trong Q #.

Ý tưởng cho hai thuật toán này là như nhau: bạn phải cung cấp lời tiên tri cho thuật toán như một thao tác được thực hiện ở nơi khác. Bằng cách này, thuật toán không biết được lời tiên tri nào được đưa ra và không có cách nào để "nhìn" vào nhà tiên tri khác hơn là gọi nó. Các hướng dẫn này cũng có một khai thác để tính số lần gọi của nhà tiên tri, do đó, nếu giải pháp của bạn gọi nó nhiều lần, nó sẽ thất bại trong bài kiểm tra.

Phải thừa nhận rằng, điều này vẫn có một vấn đề mà thuật toán tiên tri thường gặp phải: một con người có thể nhìn vào việc thực hiện bài kiểm tra và về lời tiên tri được thông qua và tìm ra câu trả lời bằng cách tìm ra lời tiên tri nào được thực hiện. Điều này có thể được chống lại bằng cách ngẫu nhiên lựa chọn nhà tiên tri, như DaftWullie đề xuất.


1

Tôi nghĩ rằng ahelwercâu trả lời đó chạm vào một số cách mà chúng ta nghĩ về sự phức tạp của các thuật toán. Tuy nhiên - do chúng ta không thực sự có "tiên tri" trong thế giới thực mà chúng ta muốn truy vấn, bạn có thể tự hỏi tại sao chúng ta lại lo lắng về sự phức tạp của truy vấn hoặc ý tưởng về các nhà tiên tri. Tôi sẽ cố gắng đưa ra một số quan điểm về điều này, và đặc biệt để mô tả cách bạn có thể cố gắng nghĩ cách xây dựng một "nhà tiên tri Đức Josza" theo cách mà bạn không cảm thấy như thể bạn đang gian lận.

(Như đã Norbert Schuchchỉ ra, đối với vấn đề tiếng Đức là trường hợp cơ bản của tiếng Đức, thì không có nhiều phạm vi để hiểu, nhưng tôi hy vọng rằng câu hỏi của bạn về các nhà tiên tri cũng áp dụng chung hơn. Đó là những gì tôi sẽ nói ở đây.)

Một trực giác về các nhà tiên tri

Khái niệm về một nhà tiên tri là một cách để cho phép bản thân chúng ta đơn giản hóa cách chúng ta nói về các vấn đề tính toán.

Ứng dụng ban đầu của khái niệm nhà tiên tri là xem xét giả thuyết những gì chúng ta có thể làm nếu chúng ta có thể giải quyết những vấn đề khó khăn, thậm chí là những vấn đề không thể, mà không cam kết làm thế nào chúng ta có thể làm điều đó ngay cả về nguyên tắc. Nhưng trong sự phức tạp tính toán ngày nay - đặc biệt là trong tính toán lượng tử, ví dụ như  trong các trường hợp của Đức Greg Jos Josza, Bernstein, Vazirani, và các vấn đề tiên tri khác - tình huống là khác nhau: nhà tiên tri mô tả một chức năng là cơ sở của vấn đề. Thực tế rằng đó là 'một lời tiên tri' là một cách để cấu trúc cách chúng ta mô tả chức năng là trung tâm của vấn đề: không phải chúng ta không bao giờ phải suy nghĩ về cách tính toán của hàm, mà thông tin này đơn giản không được cung cấp như một phần của vấn đề và chúng tôi không quan tâm đến thời gian hoặc sự phức tạp khác liên quan đến chức năng đó.

Khi chúng ta thực hiện phương pháp này, chúng ta thực sự có thể có được câu trả lời liên quan đến những câu hỏi rất khó tính toán. Ví dụ, bạn có thể biết rằng chúng tôi không biết làm thế nào để chứng minh hoặc P  ≠  NP hoặc P  =  NP , nhưng mà chúng ta có thể thấy rằng có những thầy mo Một ví dụ mà chúng ta có thể chứng minh rằng P Một  ≠  NP Một . Điều mà nhà tiên tri A làm ở đây không giúp máy tính (chính xác hơn là máy Turing xác định hoặc máy Turing không xác định) để giải quyết vấn đề - nó đại diện cho vấn đề mà máy tính phải giải quyết. Thực tế là chúng ta có thể chỉ ra trong một số trường hợp rằng P A ≠  NP Một , không có nghĩa là Pthực sự khác biệt so với NP : nó chỉ có nghĩa rằng chỉ sử dụng nondeterminism thực sự là một nguồn lực quan trọng cho một mô hình tính toán để có - nó cho phép bạn để giải quyết một số vấn đề một cách hiệu quả, và không có cách nào nói chung để mô phỏng thuyết không điều kiện hiệu quả trên một máy tính xác định. Vì vậy, nếu bạn muốn giải quyết vấn đề liên quan đến những gì Một tính, bạn hoàn toàn có thể yêu cầu một số thông tin về cấu trúc của bất kỳ chức năng mà có thể tính toán một cách hiệu quả Một .

Đây là một trong những điều chính mà các nhà tiên tri nói đến: chúng cho phép bạn nói về những cách mà các mô hình tính toán có thể hoặc không thể giải quyết vấn đề, khi bạn được cung cấp thông tin hạn chế về vấn đề.

Sử dụng thuật toán oracle để giải quyết các vấn đề phi tiên tri

Thuật toán tiếng Đức Josza Josza, hay thuật toán BernsteinTHER Vazirani, về nguyên tắc không phải là thuật toán mà người ta thực hiện vì lợi ích của riêng họ. (Chà, không thực sự - xem Phần tiếp theo.) Họ đại diện cho những cách mà bạn có thể giải quyết vấn đề . Họ giải quyết vấn đề gì? Chúng cho phép bạn khám phá các tính năng nhất định của hàm mà bạn quan tâm - cho dù đó là hằng số / cân bằng hay vectơ nào được liên kết trong một số hàm tuyến tính có giá trị vô hướng trên các vectơ.

Những chức năng nào bạn thực hiện chúng trên? - Bạn thực hiện chúng trên bất kỳ chức năng nào mà bạn quan tâm đến câu trả lời.

Mô tả về các thuật toán dựa trên tiên tri này nằm bên cạnh điểm. Các vấn đề tiên tri về cơ bản cho phép bạn biết rằng, với một máy tính lượng tử lý tưởng, bạn có thể giải quyết vấn đề ngay cả khi bạn biết rất ít về chức năng , với điều kiện bạn thực sự có thể đánh giá chức năng một cách hiệu quả trong thực tế. Để thực sự đánh giá một chức năng như vậy, tất nhiên bạn sẽ cần một số mô tả về cách thực hiện, và do đó bạn có nhiều thông tin hơn trong cài đặt tiên tri; nhưng điều đó không ngăn bạn sử dụng cùng một thuật toán.

Điều gì xảy ra khi bạn có nhiều thông tin hơn trong cài đặt lời tiên tri, đó là đột nhiên có những cách khác mà bạn có thể giải quyết vấn đề. Cụ thể, thể giải quyết vấn đề một cách hiệu quả theo cách cổ điển . (Đây là quan sát tương tự như với P A  ≠  NP A : nó chứng minh rằng có các vấn đề trong NP , mà bất kỳ thuật toán xác định hiệu quả nào ít nhất sẽ yêu cầu thông tin cấu trúc thực tế để có thể giải quyết - để khi bạn cung cấp mô tả của một chức năng có thể tính toán hiệu quả chứ không phải là một 'tiên tri', có thể vấn đề sẽ xảy raP. ) Điều đó có nghĩa là thuật toán lượng tử có thể không có cùng lợi thế so với thuật toán cổ điển trong việc giải quyết vấn đề cụ thể mà bạn trình bày - và thực tế có thể là cách tiếp cận cổ điển tốt hơn (đặc biệt là với các thiết bị chúng ta hiện tại).

Cuối cùng, chỉ vì bạn có một thuật toán lượng tử để giải quyết một cái gì đó, không có nghĩa đó là cách tốt nhất để giải quyết một cái gì đó. Điều này chắc chắn đúng với thuật toán tiếng Đức Josza: ngay cả trong cài đặt tiên tri, sử dụng tính ngẫu nhiên cũng gần như tốt, và tốt hơn nhiều là chúng ta chưa có máy tính lượng tử đáng tin cậy lớn! Nhưng sau đó một lần nữa ...

"Thực hiện" một lời sấm truyền

Mục đích của việc thực hiện thuật toán tiếng Đức Josza cũng giống như thực hiện " Xin chào, thế giới! " - không phải để giải quyết vấn đề cấp bách chưa được giải quyết, mà là thực hành sử dụng một công cụ mà bạn mong đợi sẽ hữu ích để làm những việc khác.

Để thực hành mã hóa, bạn nên cảm thấy hoàn toàn thư giãn và thoải mái với ý tưởng thực hiện một lời sấm truyền, và với ý tưởng của máy tính đánh giá nhà tiên tri. Về nguyên tắc, đây là điểm của những gì bạn muốn làm. Ngay cả khi bạn đang sử dụng một trình giả lập cổ điển, trong đó máy tính cổ điển thực sự đang đánh giá tất cả các nhánh của sự chồng chất và vì vậy rõ ràng tìm ra câu trả lời cho một vấn đề để giả vờ rằng đó là một máy tính lượng tử hoạt động theo cách xoay vòng hơn một chút, vì vậy có thể - bạn đang thực hành cách sử dụng một công cụ có thể hữu ích cho những thứ khác và một ngày nào đó sẽ không được chạy trên máy tính cổ điển.

Vì vậy, làm thế nào bạn nên đi về thực hiện lời tiên tri của bạn?

(i) Nếu bạn thực sự cam kết với ý tưởng rằng bạn chỉ đang thực hành, bạn không cần phải giả vờ rằng bạn đang làm bất cứ điều gì kỳ diệu. Hãy đến với bất kỳ cách nào để thực hiện chức năng tiên tri, ngay cả khi nó rõ ràng rõ ràng đối với người quan sát thông thường cho dù kết quả là không đổi hoặc cân bằng. Bạn chỉ đang cố gắng thực hành nhận ra một thuật toán - đừng lo lắng rằng ai đó sẽ buộc tội bạn là kẻ mạo danh, rằng bạn đang giả vờ chữa bệnh ung thư nhưng thực sự đang chơi với Lego. Bạn không bao giờ được giả vờ để chữa bệnh ung thư, và bạn đang chơi với Lego bởi sự lựa chọn có chủ ý. Nắm bắt điều đó và chỉ cần làm điều đó.

f(x)=g(x,r)rg(x,r)xrvà nơi không rõ ràng làm thế nào để giải quyết nó một cách cổ điển, là không tầm thường.

  • g(x,r)=xrx,r{0,1}ng(x,r)f(x)f(x)r0

  • Có thể hình dung rằng việc xây dựng ở trên có thể được xây dựng / làm xáo trộn phần nào, để có được một công trình được đảm bảo để đánh giá một hàm hằng hoặc hàm cân bằng, và trong đó hai điều này xảy ra không rõ ràng hoặc thậm chí khó khăn - nhưng tôi có thể ' T nghĩ làm thế nào, tại thời điểm này.

Hãy nhớ rằng điều này thực sự rất khó thực hiện - nhưng nếu bạn có thể thấy một cách để làm điều đó, nó có thể rất đáng giá: Bravyi, Gossett và Koening đã làm điều gì đó như thế này cho vấn đề Bernstein Vazirani, và nó cho phép họ cho thấy một sự tách biệt nhỏ nhưng vô điều kiện giữa độ phức tạp lượng tử và cổ điển, đó là một trong những điều thú vị hơn xảy ra trong sự phức tạp lượng tử trong vài năm qua.

TL; DR

  • Đừng đổ mồ hôi vì thực tế là bạn đang 'đánh giá' một lời sấm truyền.

  • Nếu bạn đổ mồ hôi vì bất cứ điều gì, chỉ lo lắng rằng một mô tả thực tế của chức năng có thể giúp giải quyết vấn đề tương tự một cách dễ dàng mà không cần máy tính lượng tử.

  • Nếu động lực của bạn chỉ là để thực hành với lập trình lượng tử, thậm chí đừng lo lắng về điều đó. Lưu lo lắng của bạn cho các vấn đề worthier, như sự nóng lên toàn cầu. Trong khi chờ đợi, hãy tận hưởng việc chơi với Legos trong khi bạn xây dựng một thứ gì đó nhiều hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.