Bagaimana cara mendapatkan nilai yang tidak diketahui diberi daftar


19

Adakah yang bisa membantu saya dengan masalah berikut?

Saya ingin menemukan beberapa nilai ai,bj (mod N ) di mana i=1,2,,K,j=1,2,,K (misalnya K=6 ), diberi daftar nilai K2 yang sesuai dengan perbedaan aibj(modN) (misalnya N=251 ), tanpa mengetahui hubungan konkret yang sesuai. Karena nilai-nilai ai,bj(modN) tidak unik didefinisikan mengingat perbedaan aibj(modN) , kita mencari setiap tugas yang valid dari nilai-nilai.

Jelas, mencoba setiap permutasi dari angka K2 dalam daftar (benar-benar K2! Kasus yang mungkin) dan kemudian memecahkan persamaan modular dengan ai,bj karena variabel tidak layak.

Bahkan, masalah ini muncul dalam sebuah makalah tentang cryptanalysis ke versi awal skema tanda tangan NTRU ( http://eprint.iacr.org/2001/005 ). Namun, penulis hanya menulis satu kalimat "Algoritma backtrack sederhana menemukan satu solusi ..." (dalam Bagian 3.3) dan siapa pun dapat memberikan lebih banyak penjelasan? Terlebih lagi, penulis juga menyebutkan bahwa “setiap shift melingkar {((ai+M)modN,(bi+M)modN}i=1K atau swap ({(N1bi,N1ai)}i=1K) menghasilkan pola yang sama dari aibjmodN ”dan apakah pernyataan ini bermanfaat?


7
Perhatikan bahwa tidak mungkin untuk memulihkan ai,bj , karena jika Anda menambahkan beberapa konstanta C ke semua angka, maka perbedaannya tetap sama.
Yuval Filmus

1
@Yuval: Ini sudah termasuk dalam kalimat terakhir dari deskripsi. Saya pikir hanya satu solusi yang diperlukan, karena beberapa mungkin ada.
domotorp

2
@Yuval Maaf karena tidak menunjukkan bahwa ai,bj ‘s juga harus diambil modular N . Jadi tidak ada solusi yang tak terbatas.
seorang tamu

@domotorp Ya, menemukan salah satu solusinya tidak apa-apa.
seorang tamu

1
Mungkin OP dapat mengklarifikasi bahwa ai , bj diambil modulo N sebelumnya dalam posting: mungkin dalam judul atau dalam paragraf pertama. Masalah dengan konstanta C juga layak disebutkan. Kedua hal itu membingungkan saya ketika saya mulai membaca.
Juan Bermejo Vega

Jawaban:


4

Berikut ini adalah saran, untuk dan . Kami diberi daftar . Mulailah dengan mengambil salah satunya, tanpa kehilangan umum . Tanpa kehilangan umum , dan kami memperoleh nilai . Sekarang ambil yang lain, dan harap itu dalam bentuk (ini terjadi dengan probabilitas ), dan simpulkan .N = 251 a i - b jK=6N=251aibj(modN)a1b1b1=0a1a2b15/35=1/7a2

Pada tahap ini, kita tahu . Tujuan kami berikutnya adalah mencari untuk . Untuk setiap kandidat , jika maka juga harus ada dalam daftar. Jika , maka probabilitas bahwa juga ada dalam daftar adalah sekitar . Jadi jika kita menemukan beberapa kandidat yang juga ada dalam daftar, maka mungkin . Dengan cara ini, kita dapat memulihkan dengan pasti.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 ) + ( a 2 - aa1,a2,b1a1bjj1aibji=1(aibj)+(a2a1)=a2bji133 / 251 a i - b j ( a i - b j ) + ( a 2 - a 1 ) i = 1 b 2(aibj)+(a2a1)33/251aibj(aibj)+(a2a1)i=1b2

Pada tahap ini, kita tahu . Dengan cara yang sama seperti kami memulihkan , kami dapat memulihkan dengan kepastian yang masuk akal. Kami kemudian dapat memulihkan dengan mencari kandidat yang dan keduanya ada dalam daftar. Karena kita memiliki lebih banyak s, probabilitas kegagalan kita turun secara berarti. Kami melanjutkan dan menemukan .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 , a 4 , b 4a1,a2,b1,b2b2a3b3aibj(aibj)+(a2a1)(aibj)+(a3a1)ab3,a4,b4,a5,b6,a6,b6

Pada titik mana pun dalam algoritme ini, kami mungkin telah menebak sesuatu yang salah, dan ini pada akhirnya akan menghasilkan kontradiksi (katakan pada titik tertentu, tidak ada kandidat yang baik ). Kami kemudian mundur dan mencoba kemungkinan lain; jika kita menghabiskan semua kemungkinan, kita mundur lagi, dan mencoba kemungkinan lain (untuk tahap algoritma yang berbeda); dan seterusnya.aibj

Ini adalah latihan yang baik untuk benar-benar memprogram algoritma ini - itu mungkin satu-satunya cara untuk memahami bagaimana menerapkan pengulangan dengan benar. Itu juga satu-satunya cara untuk mengetahui apakah algoritma ini berfungsi dalam praktik.


Terima kasih dan saya juga akan mengkode mundur ini untuk membuatnya lebih dipahami. Mungkin penulis makalah asli itu menggunakan metode yang sama karena ia juga menyebut "mundur".
seorang tamu

Maaf karena lupa memposting komentar saya untuk jawaban Anda! Saya juga menerapkan metode yang Anda sarankan (dalam C ++). Kesimpulannya adalah bahwa algoritme Anda bekerja dengan sangat baik dan salah satu solusi dapat ditemukan dengan sangat cepat (dalam waktu kurang dari sedetik pada PC saya). Dan kali ini, saya bisa memahami prosedur backtrack dengan lebih baik. Terima kasih banyak!
seorang tamu

Mengapa saya tidak bisa "@Yuval" di komentar terakhir saya ?! Maaf, tapi saya sudah mencoba beberapa kali.
tamu

Mungkin Anda bisa membagikan kode secara online, sehingga orang lain yang membaca koran akan memiliki akses ke kode itu.
Yuval Filmus

5

Pembaruan : Deskripsi di bawah ini untuk masalah yang berbeda (di mana Anda memiliki semua jarak berpasangan dalam satu set daripada jarak berpasangan antara dua set yang berbeda). Saya akan meninggalkannya karena itu terkait erat.

Masalah ini disebut masalah beltway, dan merupakan kasus khusus dari masalah embedding -torus umum . Hal ini juga berkaitan erat dengan masalah turnpike, di mana perbedaan jarak bersifat absolut (bukan modulo beberapa angka).d

Tidak diketahui apakah masalah beltway menerima algoritma poli-waktu. Ada berbagai algoritma pseudo-poli-waktu untuk pertanyaan terkait. Referensi terbaik (sayangnya yang lama) adalah karya Lemke, Skiena dan Smith .


1
Saya pikir masalah ini berbeda. Dalam masalah beltway kita tahu semua jarak berpasangan, di sini kita hanya tahu antara dua titik yang berada dalam kelompok yang berbeda. Walaupun ini kelihatannya kurang informasi, sebenarnya bisa membantu menyelesaikan masalah.
domotorp

Ah iya. ini adalah grafik bipartit. poin yang bagus.
Suresh Venkat

Grafik bipartit? Sesuatu seperti. Mungkin saya harus mencoba masalah ini dengan cara ini, tetapi saya tidak memiliki pemikiran yang konkret sekarang.
seorang tamu

3

Berikut adalah pengamatan yang saya pikir memberi Anda pijakan, mungkin cukup satu untuk menyelesaikan masalah.

Misalkan kita memiliki empat perbedaan , , , yang muncul sebagai perbedaan berpasangan antara dua dan dua . Sebut ini kuartet perbedaan. Perhatikan bahwa kami memiliki hubungan non-sepele:a 1 - b 2 a 2 - b 1 a 2 - b 2 a ba1b1a1b2a2b1a2b2ab

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

Anda dapat mencoba menggunakan hubungan ini untuk mengidentifikasi kuartet potensial dari daftar . Misalnya, pilih empat perbedaan dari daftar; jika mereka tidak memuaskan hubungan di atas, maka mereka pasti tidak muncul dari struktur kuartet; jika mereka memuaskan hubungan itu, mereka mungkin muncul dari kuartet.K2

Ada banyak cara yang bisa Anda ambil dari sini, tapi saya kira ini sudah cukup.

Saya terutama menduga bahwa, untuk pengaturan parameter contoh Anda, masalahnya akan sangat mudah, karena tes di atas untuk mengenali kuartet mungkin tidak akan memiliki terlalu banyak false positive. Cara kami semua memilih 4 perbedaan dari daftar, akan ada kuartet (yang semuanya akan memuaskan hubungan) dan sisanya adalah non-kuartet (yang memenuhi hubungan dengan probabilitas , heuristik). Oleh karena itu kami berharap untuk melihat tentang positif palsu, yaitu, 4-tuple yang lulus tes meskipun mereka bukan kuartet. Untuk parameter Anda, ini berarti kami memiliki 225 kuartet dan( K(K24)1/N((K2(K2)21/N(58905-225)/251234((K24)(K2)2)/N(58905225)/251234positif palsu lainnya; jadi sekitar setengah dari 4-tupel yang lulus tes sebenarnya adalah kuartet. Ini berarti bahwa tes di atas adalah cara yang cukup baik untuk mengenali kuartet. Setelah Anda dapat mengenali kuartet, Anda dapat benar-benar pergi ke kota untuk memulihkan struktur daftar perbedaan.


@ WD: Terima kasih, tapi saya sekarang bertanya-tanya langkah selanjutnya setelah semua kuartet yang mungkin (benar-benar 225 + 234 = 459) ditemukan. Haruskah mencari 3 kuartet yang tidak tumpang tindih dan menguji apakah mereka dapat menjadi solusi yang mungkin? Bagaimana cara mencapai ini secara efisien? Mungkin tidak begitu sulit karena tidak akan ada banyak tumpang tindih.
seorang tamu

@pertanyaan terbaik, pertanyaan bagus! Saya tidak ingat apa yang saya pikirkan saat itu. Saya pikir saya ingat berpikir satu pendekatan bisa dimulai dengan satu kuartet, kemudian mencari semua yang lain yang tumpang tindih dalam 2 perbedaan (misalnya, timbul dari mana ), tapi saya tidak tahu ke mana harus pergi dari sana (cara memfilter positif palsu). j 2a1,aj,b1,b2j2
DW

3

Berikut adalah pendekatan yang berbeda, berdasarkan pada iteratif menemukan angka yang tidak dapat muncul di antara . Sebut satu set over-perkiraan dari 's jika kita tahu bahwa . Demikian pula, adalah overapproximation dari 's jika kita tahu bahwa . Jelas, lebih kecil , semakin berguna ini lebih-pendekatan adalah, dan yang sama berlaku untuk . Pendekatan saya didasarkan pada iteratif memperbaiki perkiraan berlebihan ini, yaitu, secara iteratif mengurangi ukuran set ini (karena kami mengesampingkan semakin banyak nilai yang tidak mungkin).A a { a 1 , ... , a 6 } A B b { b 1 , ... , b 6 } B A B{a1,,a6}Aa{a1,,a6}ABb{b1,,b6}BAB

Inti dari pendekatan ini adalah metode untuk penyempurnaan : diberikan over-aproksimasi untuk 's dan over-aproksimasi untuk 's, temukan over-aproksimasi baru untuk sehingga . Secara khusus, biasanya akan lebih kecil dari , jadi ini memungkinkan kita untuk memperbaiki perkiraan-lebih untuk .a B b A a A AAaBbAaAA A aAAa

Dengan simetri, pada dasarnya trik yang sama akan memungkinkan kita memperbaiki perkiraan-over kita untuk 's: diberi over-aproksimasi untuk 's dan over-aproksimasi untuk 's, ia akan menghasilkan over baru -approximation untuk 's.A a B b B bbAaBbBb

Jadi, izinkan saya memberi tahu Anda cara melakukan penyempurnaan, maka saya akan menggabungkan semuanya untuk mendapatkan algoritme lengkap untuk masalah ini. Dalam apa yang berikut, biarkan menunjukkan multi-set perbedaan, yaitu, ; kita akan fokus pada menemukan disempurnakan selama-pendekatan , diberikan .D = { a i - b j : 1 i , j 6 } A A , BDD={aibj:1i,j6}AA,B

Cara menghitung penyempurnaan. Pertimbangkan satu perbedaan . Pertimbangkan set . Berdasarkan pengetahuan kami bahwa adalah perkiraan yang berlebihan dari , kami tahu bahwa setidaknya satu elemen harus merupakan elemen dari . Oleh karena itu, kita dapat memperlakukan setiap elemen di sebagai "saran" untuk nomor untuk mungkin termasuk di . Jadi, mari kita sapu semua perbedaan dan, untuk masing-masing, identifikasi nomor mana yang "disarankan" oleh .d + B = { d + y : y B } B b d + B { a 1 , , a 6 } d + B A d D ddDd+B={d+y:yB}Bbd+B{a1,,a6}d+BAdDd

Sekarang saya akan mengamati bahwa angka pasti akan disarankan setidaknya 6 kali selama proses ini. Mengapa? Karena perbedaan dalam , dan ketika kami memprosesnya, akan menjadi salah satu angka yang disarankan (karena kami dijamin bahwa , pasti akan menyertakan ). Demikian pula, perbedaan muncul di suatu tempat di , dan itu akan menyebabkan disarankan lagi. Dengan cara ini, kita melihat bahwa nilai akan disarankan setidaknya 6 kali. Hal yang sama berlaku untuk , danaa1 D a 1 b 1B ( a 1 - b 1 ) + B a 1 a 1 - b 2 D a 1 a 1 a 2 a 3a1b1Da1b1B(a1b1)+Ba1a1b2Da1a1a2a3, dan seterusnya.

Jadi, mari menjadi himpunan angka yang telah disarankan setidaknya 6 kali. Ini pastinya merupakan perkiraan yang berlebihan dari , oleh komentar di atas.a aAaa

Sebagai optimasi, kita bisa menyaring semua saran yang tidak hadir dalam segera: dengan kata lain, kita bisa memperlakukan perbedaan sebagai menyarankan semua nilai-nilai . Memastikan bahwa kita akan memiliki . Kami berharap lebih kecil dari ; tidak ada jaminan, tetapi jika semuanya berjalan dengan baik, mungkin itu akan terjadi.d ( d + B ) A A A A AAd(d+B)AAAAA

Menyatukan ini, algoritma untuk memperbaiki untuk menghasilkan adalah sebagai berikut:A A,BA

  1. Biarkan . Ini adalah serangkaian saran.S=dD(d+B)A

  2. Menghitung berapa kali setiap nilai muncul dalam . Mari menjadi seperangkat nilai-nilai yang muncul setidaknya 6 kali di . (Ini dapat diimplementasikan secara efisien dengan membangun sebuah array dari 251 awalnya, awalnya semua nol, dan setiap kali jumlah disarankan, Anda selisih ; pada akhirnya Anda menyapu melalui mencari elemen yang nilainya 6 atau lebih besar)A S a s a [ s ] aSASasa[s]a

Metode serupa dapat dibangun untuk memperbaiki untuk mendapatkan . Anda hal-hal pada dasarnya terbalik di atas dan flip beberapa tanda-tanda: misalnya, bukannya , Anda melihat .B d + B - d + AA,BBd+Bd+A

Cara menghitung perkiraan awal yang berlebihan. Untuk mendapatkan perkiraan awal berlebihan kami, satu ide adalah mengasumsikan (wlog) bahwa . Oleh karena itu, setiap nilai harus muncul di suatu tempat di antara , sehingga daftar perbedaan dapat digunakan sebagai perkiraan awal awal kami untuk . Sayangnya, ini tidak memberi kami perkiraan yang terlalu berguna untuk 's.a i D D a bb1=0aiDDab

Pendekatan yang lebih baik adalah dengan menebak nilai salah satu nilai . Dengan kata lain, kami menganggap (wlog) bahwa , dan menggunakan sebagai perkiraan awal kami atas . Lalu, kami menebak mana dari 36 nilai ini yang memang salah satu dari nilai , katakan . Itu kemudian memberi kita perkiraan yang berlebihan untuk 's. Kami menggunakan perkiraan awal A yang berlebihan ini , kemudian secara iteratif memperbaikinya sampai konvergensi, dan menguji apakah hasilnya benar. Kami mengulangi hingga 36 kali, dengan 36 tebakan berbeda pada (rata-rata 6 tebakan seharusnya cukup) sampai kami menemukan satu yang berfungsi.b 1 = 0 A = D a a a 1 B = a 1 - D b A , B a 1ab1=0A=Daaa1B=a1DbA,Ba1

Algoritma penuh. Sekarang kita dapat memiliki algoritma lengkap untuk menghitung . Pada dasarnya, kami menurunkan perkiraan awal untuk dan , lalu memperbaiki secara iteratif. A Ba1,,a6,b1,,b6AB

  1. Buat tebakan: Untuk setiap , tebak . Lakukan hal berikut:a 1 = zzDa1=z

    1. Perkiraan awal yang berlebihan: Tentukan dan .B = z - DA=DB=zD

    2. Perbaikan berulang : Terapkan berulang-ulang berikut ini sampai konvergensi:

      • Perbaiki untuk mendapatkan over-pendekatan baru dari 's.B bA,BBb
      • Perbaiki untuk mendapatkan over-pendekatan baru dari 's.A aA,BAa
      • Biarkan dan .A:=AB:=B
    3. Periksa keberhasilan: Jika set yang dihasilkan masing-masing memiliki ukuran 6, uji apakah solusi tersebut valid untuk masalah tersebut. Jika ya, berhenti. Jika tidak, lanjutkan dengan perulangan nilai kandidat .zA,Bz

Analisis. Akankah ini berhasil? Apakah pada akhirnya konvergen pada dan , atau akankah ia macet tanpa menyelesaikan masalah sepenuhnya? Cara terbaik untuk mengetahuinya mungkin dengan mengujinya. Namun, untuk parameter Anda, ya, saya berharap ini akan efektif.B = { b 1 , ... , b 6 }A={a1,,a6}B={b1,,b6}

Jika kita menggunakan metode # 1, selamatidak terlalu besar, heuristik saya berharap ukuran set menyusut secara monoton. Pertimbangkan berasal dari . Setiap perbedaan menyarankannilai-nilai; salah satunya benar, dan yang lain dapat diperlakukan (secara heuristik) sebagai angka acak. Jika adalah angka yang tidak muncul di antara , berapakah probabilitas bahwa angka tersebut bertahan dari pemfilteran dan ditambahkan ke ? Nah, kami berharap akan menyarankan tentangA A , B d | B | | B | - 1 x a A * a ( | B | - 1 ) × 36 / 251 | B | 36 x p = 0,4 | B | | B | = 30 p 0,25 A p|A|,|B|AA,Bd|B||B|1xaAa(|B|1)×36/251kali total (rata-rata, dengan standar deviasi tentang akar kuadrat itu). Jika , probabilitas bahwa salah bertahan dari penyaringan harus sekitar atau lebih (menggunakan perkiraan normal untuk binomial, dengan koreksi kontinuitas). (Peluangnya lebih kecil jika lebih kecil; misalnya, untuk , saya perkirakan .) Saya berharap ukuran sekitar , yang akan benar-benar meningkatkan pendekatan yang berlebihan karena ini benar-benar lebih kecil dari. Misalnya, jika , maka berdasarkan heuristik ini saya harapkan|B|36xp=0.4|B||B|=30p0.25A| A | | A | = | B | = 36 | A | 18 | A |p(|A|6)+6|A||A|=|B|=36|A|18 , yang merupakan peningkatan besar atas.|A|

Oleh karena itu, saya memperkirakan bahwa waktu berjalan akan sangat cepat. Saya berharap sekitar 3-5 iterasi perbaikan sudah cukup untuk konvergensi, biasanya, dan sekitar 6 tebakan pada mungkin sudah cukup. Setiap operasi penyempurnaan melibatkan mungkin beberapa ribu memori membaca / menulis, dan kami melakukannya mungkin 20-30 kali. Jadi, saya berharap ini sangat cepat, untuk parameter yang Anda tentukan. Namun, satu-satunya cara untuk mengetahui dengan pasti adalah mencobanya dan melihat apakah itu berfungsi dengan baik atau tidak.z


@DW: Terima kasih banyak atas jawaban panjang Anda dan usaha yang Anda lakukan untuk mengetik begitu banyak kata !!! Menurut uraian Anda, algoritme Anda di sini cukup benar. Dan saya akan mengkodekannya untuk menguji efisiensi sekarang.
seorang tamu

@ WD: Hai, saya sudah mengimplementasikan deskripsi Anda di C ++. Algoritma berjalan cepat dan langkah perbaikan tidak mengurangi ukuran dari set asli dan . Namun, konvergensi tampaknya tidak begitu sempurna. Bahkan, untuk setiap tebakan , ukuran akhir dan masih lebih dari 10 menurut catatan keluaran saya oleh program. Jumlah elemen yang paling sering ada ketika (dan ) tidak dapat ditingkatkan dengan pengulangan penyempurnaan lebih lanjut adalah 11, tetapi saya tidak dapat melihat angka di bawah 10. Namun, ini telah membuat masalah dapat dipecahkan dengan mencoba masing-masing 6-elemen yang dipilih dariB z D A B A B ABzDABAB
tamu

@ WD: (Dihapuskan) final dan untuk setiap tebakan (meskipun saya tidak mengimplementasikan langkah terakhir pada PC saya). Perhitungan jumlah total akan menjadi sekitar , saya perkirakan. Terima kasih banyak! B z 2 20ABz220
seorang tamu

Maaf, tapi komentar terakhir saya terlalu panjang, dan saya harus membaginya menjadi dua.
seorang tamu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.