Làm thế nào để có được các giá trị không xác định đưa ra một danh sách không có thứ tự của ?


19

Bất cứ ai có thể giúp tôi với vấn đề sau đây?

Tôi muốn tìm một số giá trị ai,bj (mod N ) trong đó i = 1,2 , Hoài , K, j = 1,2 , Lỗi , Ki=1,2,,K,j=1,2,,K (ví dụ K=6 ), đưa ra danh sách các giá trị K2 tương ứng với sự khác biệt aibj(modN) (ví dụ N=251 ), mà không biết mối quan hệ tương ứng cụ thể. Vì các giá trị ai,bj(modN) không được xác định duy nhất với các khác biệt aibj(modN) , chúng tôi tìm kiếm bất kỳ sự gán giá trị hợp lệ nào .

Chắc chắn, thử từng hoán vị của các số K2 trong danh sách (hoàn toàn là K2! trường hợp có thể) và sau đó giải phương trình mô đun với ai,bj vì các biến là không khả thi.

Trên thực tế, vấn đề này phát sinh trong một bài báo về phân tích mật mã thành phiên bản đầu tiên của sơ đồ chữ ký NTRU ( http://eprint.iacr.org/2001/005 ). Tuy nhiên, tác giả chỉ viết một câu Thuật toán thuật toán quay lui đơn giản, tìm kiếm một giải pháp trên màn hình (trong mục 3.3) và vì vậy có ai có thể giải thích thêm không? Hơn nữa, tác giả cũng đề cập rằng, mỗi dịch chuyển tròn {((ai+M)modN,(bi+M)modN}i=1K hoặc hoán đổi ({(N1bi,N1ai)}i=1K) dẫn đến cùng một mẫu của aibjmodN và câu nói này có hữu ích không?


7
Lưu ý rằng không thể khôi phục ai,bj , vì nếu bạn thêm một số C không đổi Cvào tất cả các số, thì sự khác biệt vẫn giữ nguyên.
Yuval Filmus

1
@Yuval: Điều này đã được bao gồm trong câu cuối cùng của mô tả. Tôi nghĩ chỉ cần một giải pháp là có thể tồn tại.
domotorp

2
@Yuval Xin lỗi vì không chỉ ra rằng ai,bj ‘s cũng cần được thực hiện môđun N . Vì vậy, không có giải pháp vô hạn.
một vị khách

@domotorp Có, tìm bất kỳ một trong những giải pháp là OK.
một vị khách

1
Có lẽ OP có thể làm rõ rằng ai , bj được lấy modulo N trước đó trong bài viết: có lẽ trong tiêu đề hoặc trong đoạn đầu tiên. Vấn đề với hằng số C cũng đáng được đề cập. Cả hai điều làm tôi bối rối khi tôi bắt đầu đọc.
Juan Bermejo Vega

Câu trả lời:


4

Đây là một gợi ý, cho và . Chúng tôi được cung cấp một danh sách . Bắt đầu bằng cách lấy một trong số chúng, mà không mất tính tổng quát . Không mất tính tổng quát và chúng tôi có được giá trị của . Bây giờ lấy một cái khác và hy vọng rằng nó có dạng (điều này xảy ra với xác suất ) và suy ra .N = 251 a iK=6N=251một 1 - b 1 b 1 = 0 một 1 một 2 - b 1 5 / 35 = 1 / 7 mộtaibj(modN)a1b1b1=0a1a2b15/35=1/7a2

Ở giai đoạn này, chúng ta biết . Mục tiêu tiếp theo của chúng tôi là tìm kiếm cho . Đối với mỗi ứng viên , nếu thì cũng nên có trong danh sách. Nếu , thì xác suất cũng nằm trong danh sách là khoảng . Vì vậy, nếu chúng tôi tìm thấy một số ứng cử viên mà cũng có trong danh sách, thì có lẽ . Bằng cách này, chúng tôi có thể phục hồi một cách chắc chắn.a 1 - b j j 1 a i - b j i = 1 ( a i - b j ) + ( a 2 - a 1 ) = a 2 - b j i 1 ( a i - b j ) + ( 1 ) 33 /a1,a2,b1a1bjj1aibji=1(aibj)+(a2a1)=a2bji1(aibj)+(a2a1)a i - b j ( a i - b j ) + ( a 2 - a 1 ) i = 1 b33/251aibj(aibj)+(a2a1)i=1b2

Ở giai đoạn này, chúng ta biết . Trong cùng một cách mà chúng ta phục hồi , chúng tôi có thể phục hồi với sự chắc chắn hợp lý. Sau đó, chúng tôi có thể khôi phục bằng cách tìm kiếm một ứng cử viên mà và đều có trong danh sách. Bởi vì chúng tôi có nhiều hơn s, xác suất thất bại của chúng tôi giảm đáng kể. Chúng tôi tiếp tục và tìm .b 2 a 3 b 3 a i - b j ( a i - b j ) + ( a 2 - a 1 ) ( a i - b j ) + ( a 3 - a 1 ) a b 3 , aa1,a2,b1,b2b2a3b3aibj(aibj)+(a2a1)(aibj)+(a3a1)ab3,a4,b4,a5,b6,a6,b6

Tại bất kỳ điểm nào trong thuật toán này, chúng tôi có thể đã đoán sai điều gì đó và điều này cuối cùng sẽ dẫn đến một mâu thuẫn (nói tại một số điểm, không có ứng cử viên tốt ). Sau đó chúng tôi quay lại và thử một khả năng khác; nếu chúng ta cạn kiệt tất cả các khả năng, chúng ta quay lại một lần nữa và thử một khả năng khác (đối với một giai đoạn khác của thuật toán); vân vânaibj

Đây là một bài tập tốt để thực sự lập trình thuật toán này - đó có lẽ là cách duy nhất để hiểu cách thực hiện quay lui chính xác. Đó cũng là cách duy nhất để biết liệu thuật toán này có hoạt động trong thực tế hay không.


Cảm ơn bạn và tôi cũng sẽ viết mã quay lại này để hiểu rõ hơn. Có lẽ tác giả của bài báo gốc đó đã sử dụng một phương pháp tương tự vì ông cũng đề cập đến "backtrack".
một khách

Xin lỗi vì đã quên đăng bình luận của tôi vào câu trả lời của bạn! Tôi cũng đã thực hiện phương pháp mà bạn đề xuất (trong C ++). Kết luận là thuật toán của bạn hoạt động khá tốt và một trong những giải pháp có thể được tìm thấy rất nhanh (trong chưa đầy một giây trên PC của tôi). Và lần này, tôi có thể hiểu các thủ tục quay lui tốt hơn. Cảm ơn nhiều!
một vị khách

Tại sao tôi không thể "@Yuval" trong bình luận cuối cùng của mình?! Xin lỗi, nhưng tôi đã thử nhiều lần.
một vị khách

Có lẽ bạn có thể chia sẻ mã trực tuyến, để những người khác đọc bài viết sẽ có quyền truy cập vào nó.
Yuval Filmus

5

Cập nhật : Mô tả bên dưới dành cho một vấn đề khác (trong đó bạn có tất cả các khoảng cách theo cặp trong một tập thay vì khoảng cách theo cặp giữa hai tập riêng biệt). Dù sao tôi cũng sẽ bỏ nó vì nó liên quan chặt chẽ.

Vấn đề này được gọi là vấn đề vành đai, và là một trường hợp đặc biệt của vấn đề nhúng -torus nói chung . Nó cũng liên quan chặt chẽ đến vấn đề quay vòng, trong đó chênh lệch khoảng cách là tuyệt đối (không phải là số modulo).d

Người ta không biết liệu vấn đề vành đai có thừa nhận thuật toán đa thời gian hay không. Có nhiều thuật toán giả đa thời gian cho các câu hỏi liên quan. Tài liệu tham khảo tốt nhất (than ôi một cái cũ) là bài báo của Lemke, Skiena và Smith .


1
Tôi nghĩ vấn đề này là khác nhau. Trong bài toán vành đai, chúng ta biết tất cả các khoảng cách theo cặp, ở đây chúng ta chỉ biết nó giữa hai điểm nằm trong các nhóm khác nhau. Mặc dù điều này có vẻ như ít thông tin hơn, nhưng thực tế nó có thể giúp giải quyết vấn đề.
domotorp

À đúng rồi. đó là một đồ thị lưỡng cực. điểm tốt.
Suresh Venkat

Đồ thị hai bên? Cái gì đó như. Có lẽ tôi nên thử vấn đề theo cách này, nhưng bây giờ tôi không có sự suy nghĩ cụ thể.
một vị khách

3

Đây là một quan sát mà tôi nghĩ mang đến cho bạn một chỗ đứng, có thể đủ để giải quyết vấn đề.

Giả sử chúng ta có bốn sự khác biệt , , , phát sinh như sự khác biệt giữa hai cặp 's và hai ' s. Gọi đây là một bộ tứ của sự khác biệt. Lưu ý rằng chúng ta có một mối quan hệ không tầm thường:a 1 - b 2 a 2 - b 1a1b1a1b2a2b1 a ba2b2ab

(a1b1)(a1b2)=(a2b1)(a2b2)(modN).

Bạn có thể thử sử dụng mối quan hệ này để xác định các bộ tứ tiềm năng ra khỏi danh sách . Chẳng hạn, chọn bốn điểm khác biệt trong danh sách; nếu họ không thỏa mãn mối quan hệ trên, thì họ chắc chắn không phát sinh từ cấu trúc bộ tứ; nếu họ thỏa mãn mối quan hệ, họ có thể nảy sinh từ một bộ tứ.K2

Có nhiều cách bạn có thể lấy mọi thứ từ đây, nhưng tôi nghi ngờ điều này sẽ là đủ.

Tôi đặc biệt nghi ngờ rằng, đối với các cài đặt tham số ví dụ của bạn, vấn đề sẽ khá dễ dàng, bởi vì thử nghiệm trên để nhận ra một bộ tứ có lẽ sẽ không có quá nhiều kết quả dương tính giả. Trong tất cả các cách của chúng tôi về việc chọn 4 điểm khác biệt trong danh sách, sẽ có tứ tấu (tất cả sẽ thỏa mãn mối quan hệ) và phần còn lại là các tứ không (thỏa mãn mối quan hệ với xác suất , theo kinh nghiệm). Do đó, chúng tôi hy vọng sẽ thấy về dương tính giả, tức là 4 tuple vượt qua bài kiểm tra mặc dù chúng không có tứ. Đối với các tham số của bạn, điều này có nghĩa là chúng tôi có 225 bộ tứ và( K(K24)1/N((K2(K2)21/N(58.905-225)/251234((K24)(K2)2)/N(58905225)/251234dương tính giả khác; vì vậy khoảng một nửa trong số 4 tuple vượt qua bài kiểm tra thực sự là bộ tứ. Điều này có nghĩa là bài kiểm tra trên là một cách khá tốt để nhận ra bộ tứ. Một khi bạn có thể nhận ra bộ tứ, bạn thực sự có thể đi đến thị trấn để khôi phục cấu trúc của danh sách sự khác biệt.


@DW: Cảm ơn bạn, nhưng giờ tôi đang tự hỏi bước tiếp theo sau khi tất cả các bộ tứ có thể (hoàn toàn 225 + 234 = 459 cái) được tìm thấy. Có nên tìm kiếm 3 bộ tứ không chồng chéo và kiểm tra xem chúng có thể tạo thành một giải pháp khả thi không? Làm thế nào để thực hiện điều này một cách hiệu quả? Có lẽ không quá khó khăn vì sẽ không có nhiều sự chồng chéo.
một vị khách

@ mơ hồ, câu hỏi hay! Tôi không thể nhớ những gì tôi đã nghĩ lúc đó. Tôi nghĩ rằng tôi nhớ lại rằng một cách tiếp cận có thể là bắt đầu với một bộ tứ, sau đó tìm kiếm tất cả các cách tiếp cận khác nhau theo 2 điểm khác nhau (ví dụ: phát sinh từ trong đó ), nhưng tôi không biết nơi để đi từ đó (làm thế nào để lọc ra dương tính giả). j 2a1,aj,b1,b2j2
DW

3

Đây là một cách tiếp cận khác nhau, dựa trên việc tìm kiếm các số không thể xuất hiện giữa . Gọi một tập một quá xấp xỉ của 's nếu chúng ta biết rằng . Tương tự, là một overapproximation của 's nếu chúng ta biết rằng . Rõ ràng, càng nhỏ thì sự gần đúng quá mức này càng hữu ích và . Cách tiếp cận của tôi dựa trên việc lặp đi lặp lại tinh chỉnh các giá trị gần đúng này, nghĩa là lặp đi lặp lại giảm kích thước của các bộ này (vì chúng tôi loại trừ càng nhiều giá trị càng tốt).Một một { một 1 , ... , một 6 } A B b { b 1 , ... , b 6 } B Một B{a1,,a6}Aa{a1,,a6}ABb{b1,,b6}BAB

Cốt lõi của phương pháp này là một phương pháp cho tinh tế : cho trước một quá xấp xỉ cho 's và một quá xấp xỉ cho ' s, hãy tìm một quá xấp xỉ mới cho 's sao cho . Cụ thể, thông thường sẽ nhỏ hơn , vì vậy điều này cho phép chúng tôi tinh chỉnh xấp xỉ quá mức cho các .một B b A * một Một *Một Một * Một mộtAaBbAaAAAAa

Bằng cách đối xứng, về cơ bản, cùng một mẹo sẽ cho phép chúng tôi tinh chỉnh mức xấp xỉ quá mức của chúng tôi cho 's: đưa ra một xấp xỉ gần đúng cho và một xấp xỉ gần đúng cho , nó sẽ tạo ra một kết quả mới -appro xấp xỉ cho 's.A a B b B bbAaBbBb

Vì vậy, hãy để tôi cho bạn biết cách tinh chỉnh, sau đó tôi sẽ kết hợp mọi thứ lại với nhau để có được thuật toán đầy đủ cho vấn đề này. Trong phần tiếp theo, hãy để biểu thị nhiều tập hợp khác nhau, nghĩa là, ; chúng tôi sẽ tập trung vào việc tìm kiếm một tinh quá xấp xỉ , do .D = { một i - b j : 1 i , j 6 } Một * Một , BDD={aibj:1i,j6}AA,B

Làm thế nào để tính toán một sàng lọc. Hãy xem xét một sự khác biệt duy nhất . Xét tập hợp . Dựa trên kiến ​​thức của chúng tôi rằng là một xấp xỉ quá mức của , chúng tôi biết rằng ít nhất một phần tử của phải là một phần tử của . Do đó, chúng ta có thể đối xử với nhau của các yếu tố trong như là một "gợi ý" cho một số để có thể bao gồm trong . Vì vậy, hãy quét qua tất cả các khác biệt và, với mỗi số, hãy xác định những số nào được "gợi ý" bởi .d + B = { d + y : y B } B b d + B { a 1 , Lọ , a 6 } d + B A d D ddDd+B={d+y:yB}Bbd+B{a1,,a6}d+BAdDd

Bây giờ tôi sẽ quan sát rằng số chắc chắn sẽ được đề xuất ít nhất 6 lần trong quá trình này. Tại sao? Vì sự khác biệt là ở và khi chúng tôi xử lý nó, sẽ là một trong những con số mà nó gợi ý (vì chúng tôi đảm bảo rằng , chắc chắn sẽ bao gồm ). Tương tự, sự khác biệt xuất hiện ở đâu đó trong và nó sẽ khiến được đề xuất lại. Theo cách này, chúng tôi thấy rằng giá trị chính xác của sẽ được đề xuất ít nhất 6 lần. Điều tương tự giữ cho vàa 1 - b 1 D a 1 b 1B ( a 1 - b 1 ) + B a 1 a 1 - b 2 D a 1 a 1 a 2 a 3a1a1b1Da1b1B(a1b1)+Ba1a1b2Da1a1a2a3, v.v.

Vì vậy, hãy để là tập hợp các số đã được đề xuất ít nhất 6 lần. Điều này chắc chắn là một sự gần đúng quá mức của các , bởi các ý kiến ​​trên.một * mộtAaa

Là một tối ưu hóa, chúng ta có thể lọc ra tất cả ý kiến cho rằng không có mặt trong ngay lập tức: nói cách khác, chúng ta có thể đối xử với sự khác biệt như cho thấy tất cả các giá trị . Đảm bảo này chúng ta sẽ có . Chúng tôi hy vọng rằng nhỏ hơn ; không đảm bảo, nhưng nếu mọi việc suôn sẻ, có thể nó sẽ được.d ( d + B ) Một Một *Một Một * MộtAd(d+B)AAAAA

Đặt điều này lại với nhau, thuật toán tinh chỉnh để mang lại như sau:Một *A,BA

  1. Hãy . Đây là tập hợp nhiều gợi ý.S=dD(d+B)A

  2. Đếm bao nhiêu lần mỗi giá trị xuất hiện trong . Hãy là tập hợp các giá trị xuất hiện ít nhất 6 lần trong . (Điều này có thể được thực hiện một cách hiệu quả bằng cách xây dựng một mảng của 251 ban đầu, ban đầu tất cả bằng không, và mỗi lần số được đề nghị, bạn tăng ; ở cuối bạn quét qua tìm kiếm các yếu tố có giá trị là 6 hoặc lớn hơn)A S a s a [ s ] aSASasa[s]a

Một phương pháp tương tự có thể được xây dựng để tinh chỉnh để lấy . Bạn điều cơ bản ngược trên và lật một số dấu hiệu: ví dụ, thay vì , bạn nhìn vào .B * d + B - d + MộtA,BBd+Bd+A

Làm thế nào để tính toán một xấp xỉ ban đầu. Để có được xấp xỉ quá mức ban đầu của chúng tôi, một ý tưởng là giả định (wlog) rằng . Nó sau đó mỗi giá trị phải xuất hiện ở đâu đó trong , do đó danh sách các khác biệt có thể được sử dụng như ban đầu quá xấp xỉ của chúng tôi cho 's. Thật không may, điều này không cung cấp cho chúng tôi một phép tính gần đúng rất hữu ích cho các .a i D D a bb1=0aiDDab

Một cách tiếp cận tốt hơn là để đoán thêm giá trị của một trong những 's. Nói cách khác, chúng tôi giả sử (wlog) rằng và sử dụng làm giá trị gần đúng ban đầu của chúng tôi đối với các . Sau đó, chúng tôi đoán đó là một trong những giá trị 36 thực sự là một trong những 's, nói . Điều đó sau đó mang lại cho chúng ta một xấp xỉ quá mức cho các . Chúng tôi sử dụng xấp xỉ gần đúng ban đầu này , sau đó lặp lại tinh chỉnh cho đến khi hội tụ và kiểm tra xem kết quả có đúng không. Chúng tôi lặp lại tới 36 lần, với 36 lần đoán khác nhau ở (trung bình 6 lần đoán là đủ) cho đến khi chúng tôi tìm thấy một lần hoạt động.b 1 = 0 A = D a a a 1 B = a 1 - D b A , B a 1ab1=0A=Daaa1B=a1DbA,Ba1

Một thuật toán đầy đủ. Bây giờ chúng ta có thể có một thuật toán đầy đủ để tính . Về cơ bản, chúng tôi rút ra một xấp xỉ quá mức ban đầu cho và , sau đó lặp lại tinh chỉnh. Một Ba1,,a6,b1,,b6AB

  1. Đoán: Với mỗi , hãy đoán rằng . Làm như sau:a 1 = zzDa1=z

    1. Xấp xỉ quá mức ban đầu: Xác định và .B = z - DA=DB=zD

    2. Lặp lại tinh chỉnh: Áp dụng nhiều lần sau đây cho đến khi hội tụ:

      • Tinh chỉnh để có được một xấp xỉ của .B bA,BBb
      • Tinh chỉnh để có được xấp xỉ của 's.A aA,BAa
      • Đặt và . B : = B *A:=AB:=B
    3. Kiểm tra thành công: Nếu các bộ kết quả mỗi bộ có kích thước 6, hãy kiểm tra xem chúng có phải là giải pháp hợp lệ cho vấn đề không. Nếu có, dừng lại. Nếu không, tiếp tục với vòng lặp trên các giá trị ứng cử viên của .zA,Bz

Phân tích. Điều này sẽ làm việc? Cuối cùng nó sẽ hội tụ vào và , hay nó sẽ bị kẹt mà không giải quyết được hoàn toàn vấn đề? Cách tốt nhất để tìm hiểu có lẽ là để kiểm tra nó. Tuy nhiên, đối với các thông số của bạn, vâng, tôi hy vọng nó sẽ có hiệu quả.B = { b 1 , ... , b 6 }A={a1,,a6}B={b1,,b6}

Nếu chúng ta sử dụng phương pháp # 1, miễn làkhông quá lớn, theo kinh nghiệm, tôi hy vọng kích thước của các bộ sẽ co lại một cách đơn điệu. Xem xét bắt nguồn từ . Mỗi khác biệt gợi ýcác giá trị; một trong số chúng đúng và cái còn lại có thể được coi (theo kinh nghiệm) là số ngẫu nhiên. Nếu là một số không xuất hiện trong số , thì xác suất để nó tồn tại trong quá trình lọc và được thêm vào bao nhiêu? Vâng, chúng tôi hy vọng để được gợi ý về|A|,|B|AA,Bd|B||B|1xaAa(|B|1)×36/251tổng số lần (trung bình, với độ lệch chuẩn về căn bậc hai của số đó). Nếu , xác suất sai tồn tại trong quá trình lọc phải là khoảng hoặc hơn (sử dụng xấp xỉ bình thường cho nhị thức, với hiệu chỉnh liên tục). (Xác suất là nhỏ hơn nếu nhỏ; ví dụ, đối với , tôi mong đợi .) Tôi hy vọng quy mô của vào khoảng , sẽ cải thiện nghiêm ngặt mức gần đúng vì nó nhỏ hơn hoàn toàn so với. Chẳng hạn, nếu , thì dựa trên các phương pháp phỏng đoán này mà tôi mong đợi|B|36xp=0.4|B||B|=30p0.25A| Một | | Một | = | B | = 36 | Một * | 18 | Một |p(|A|6)+6|A||A|=|B|=36|A|18 , đó là một cải tiến lớn so với.|A|

Do đó, tôi dự đoán rằng thời gian chạy sẽ rất nhanh. Tôi hy vọng khoảng 3-5 lần tinh chỉnh là đủ để hội tụ, thông thường, và khoảng 6 lần đoán tại có lẽ là đủ. Mỗi hoạt động sàng lọc liên quan đến có thể vài nghìn bộ nhớ đọc / ghi và chúng tôi làm điều đó có thể 20-30 lần. Vì vậy, tôi hy vọng điều này sẽ rất nhanh, cho các tham số bạn đã chỉ định. Tuy nhiên, cách duy nhất để tìm hiểu chắc chắn là dùng thử và xem nó có hoạt động tốt hay không.z


@DW: Cảm ơn bạn rất nhiều vì câu trả lời dài của bạn và nỗ lực bạn đã bỏ ra để gõ rất nhiều từ !!! Theo mô tả của bạn, thuật toán của bạn ở đây là khá chính xác. Và tôi sẽ mã hóa nó để kiểm tra hiệu quả ngay bây giờ.
một vị khách

@DW: Xin chào, tôi đã triển khai mô tả của bạn trong C ++. Thuật toán chạy nhanh và bước tinh chỉnh sẽ làm giảm kích thước của bộ và ban đầu . Tuy nhiên, sự hội tụ dường như không quá hoàn hảo. Trên thực tế, với mỗi lần đoán , kích thước cuối cùng của và vẫn hơn 10 theo sản lượng hồ sơ của tôi theo chương trình. Số lượng phần tử hiện có thường xuyên nhất khi (và ) không thể được cải thiện bằng các lần lặp lại tinh chỉnh tiếp theo là 11, nhưng tôi khó có thể thấy một số dưới 10. Tuy nhiên, điều này đã giải quyết được vấn đề bằng cách thử từng 6 yếu tố được chọn từB z D Một * B * Một * B *ABzDABAB
một khách

@DW: (Cotinued) cuối cùng và cho mỗi lần đoán (mặc dù tôi đã không thực hiện bước cuối cùng trên PC của mình). Tổng số tiền tính toán sẽ vào khoảng , tôi ước tính. Cảm ơn nhiều! B * z 2 20ABz220
một vị khách

Xin lỗi, nhưng nhận xét cuối cùng của tôi quá dài và tôi phải chia nó thành hai.
một vị khách
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.