計算機科å¦å®Ÿé¨“åŠæ¼”ç¿’ 3 㯠CAD を用ã„㦠CPU ã‚’è¨è¨ˆã™ã‚‹æŽˆæ¥ã§ã‚る.CPU ã¯å¤šãã®å›žè·¯ã‚’組ã¿åˆã‚ã›ãªã‘ã‚Œã°å‹•ã‹ãšï¼Œãã®ä¸ã® 1 ã¤ã« n ビット入力㮠XOR 回路ãŒã‚る.ã“ã“㧠XOR 回路ã¨ã¯ï¼Œå…¥åŠ›ãƒ“ット列 x1x2...xn ã«å¯¾ã—ã¦ï¼Œx1 + x2 + ... + xn\ (mod 2) を出力ã™ã‚‹å›žè·¯ã®ã“ã¨ã‚’言ã†ï¼Žã—ã‹ã—完璧ã«å‹•ä½œã™ã‚‹ XOR 回路をè¨è¨ˆã™ã‚‹ã®ã¯æ™‚é–“ãŒã‹ã‹ã‚‹ã®ã§ï¼Œã¨ã‚Šã‚ãˆãš n ビットã®ã†ã¡ k ビットã ã‘使ㆠXOR 回路 A を作るã“ã¨ã«ã—ãŸï¼Žã¤ã¾ã‚Šï¼Œã‚ã‚‹ i1, ... , ik ãŒå˜åœ¨ã—,回路 A 㯠xi1 + xi2 + ... + xik\ (mod 2)を出力ã™ã‚‹ï¼Ž
æš«ã後ã«ä»Šåº¦ã¯ k ビット入力㮠XOR 回路ãŒæ¬²ã—ããªã£ãŸï¼Žä½•ã ç°¡å˜ã§ã¯ãªã„ã‹ï¼Žå…ˆã»ã©ã®å›žè·¯ A を使ãˆã°ã‚ˆã„.ãŸã 残念ãªã“ã¨ã«ï¼Œå›žè·¯ A ãŒã©ã® k ビットを使ã£ã¦ã„ãŸã®ã‹å¿˜ã‚Œã¦ã—ã¾ã£ãŸä¸Šã«ï¼Œå›žè·¯ A ã®è¨è¨ˆå›³ã‚‚é–“é•ã£ã¦å‰Šé™¤ã—ã¦ã—ã¾ã£ãŸï¼Žã—ã‹ã—コンパイル済ã¿ã®å›žè·¯ A ã¯æ®‹ã£ã¦ã„る.ãªã®ã§ï¼Œå…¥åŠ› x1x2...xn を入れã¦å›žè·¯ A を実行ã™ã‚‹ã“ã¨ã§ï¼Œãã®å‡ºåŠ› xi1 + xi2 + ... + xik\ (mod 2) を見るã“ã¨ã¯å‡ºæ¥ã‚‹ï¼Ž 出æ¥ã‚‹ã ã‘作æ¥ã®æ™‚é–“ã‚’çŸãã—ãŸã„ã®ã§ï¼Œå›žè·¯ A ã®å®Ÿè¡Œå›žæ•°ã«ã¯ä¸Šé™ã‚’è¨å®šã™ã‚‹ã“ã¨ã«ã—よã†ï¼Žã©ã†ã™ã‚Œã°å›žè·¯AãŒä¾å˜ã—ã¦ã„るビット i1, ... , ik を見ã¤ã‘られるã ã‚ã†ã‹ï¼Ÿ
最åˆã« n 㨠k ãŒã‚¹ãƒšãƒ¼ã‚¹åŒºåˆ‡ã‚Šã§ä¸Žãˆã‚‰ã‚Œã‚‹ï¼Žä»¥é™ï¼Œãƒ—ãƒã‚°ãƒ©ãƒ ã¯å›žè·¯ A ã«å…¥åŠ›ã‚’与ãˆï¼Œãã®å‡ºåŠ›ã‚’èªã‚€ã“ã¨ãŒå‡ºæ¥ã‚‹ï¼Žä¾‹ãˆã° C/C++ ã§å›žè·¯ A ã«ãƒ“ット列 x1x2...xn を与ãˆã‚‹ã«ã¯
printf("?x1x2...xn\n"); fflush(stdout);ã¨ã™ã‚‹ï¼Žã“ã“ã§å„ xi ã®é–“ã«ã‚¹ãƒšãƒ¼ã‚¹ã‚’ã„ã‚Œã¦ã¯ãªã‚‰ãªã„. 次ã«ï¼Œ
scanf("%d", &v);ã¨ã™ã‚‹ã¨ v ã«å¯¾å¿œã™ã‚‹å‡ºåŠ› xi1 + xi2 + ... + xik\ (mod 2) ãŒå…¥ã‚‹ï¼Ž 最終的ã«å›žè·¯ A ãŒä¾å˜ã™ã‚‹ãƒ“ット i1,...,ik を出力ã™ã‚‹ã«ã¯
printf("!i1 i2 ...ik\n"); fflush(stdout);ã¨ã™ã‚‹ï¼Žã“ã“ã§å„ ij ã®é–“ã¯ã‚¹ãƒšãƒ¼ã‚¹ã‚’ä¸åº¦ 1 ã¤ãšã¤ã„れる.
以下ã®ä¾‹ã¯ãƒ—ãƒã‚°ãƒ©ãƒ ã®å…¥å‡ºåŠ›ã®ä¾‹ã§ã‚る.左ã®åˆ—ã¯ãƒ—ãƒã‚°ãƒ©ãƒ ã®å‡ºåŠ›ï¼Œå³ã®åˆ—ã¯ãƒ—ãƒã‚°ãƒ©ãƒ ã¸ã®å…¥åŠ›ã‚’æ™‚ç³»åˆ—é †ã«ç¤ºã—ã¦ã„る.最åˆã« n k ãŒå…¥åŠ›ã¨ã—ã¦ä¸Žãˆã‚‰ã‚Œã‚‹ï¼Žã“ã“ã§ã¯ n = 2, k = 1 ã§ã‚る.次ã«å›žè·¯ A ã« 00 ã¨ã„ã†å…¥åŠ›ã‚’ã„れるã¨ï¼Œå›žè·¯ A 㯠0 ã‚’è¿”ã—ãŸï¼Žæ¬¡ã«å›žè·¯ A ã« 01 ã¨ã„ã†å…¥åŠ›ã‚’ã„れるã¨ï¼Œå›žè·¯ A ã¯å†ã³ 0 ã‚’è¿”ã—ãŸï¼Žã“ã®ã“ã¨ã‹ã‚‰å›žè·¯ A 㯠1 ビット目ã®ã¿åˆ©ç”¨ã—ã¦ã„ã‚‹ã“ã¨ãŒåˆ†ã‹ã‚Šï¼Œãƒ—ãƒã‚°ãƒ©ãƒ 㯠1 を解ç”ã¨ã—ã¦å‡ºåŠ›ã—ãŸï¼Ž
プãƒã‚°ãƒ©ãƒ ã®å‡ºåŠ› | プãƒã‚°ãƒ©ãƒ ã¸ã®å…¥åŠ› |
---|---|
2 1 | |
?00 | |
0 | |
?01 | |
0 | |
!1 |
以下ã®ä¾‹ã§ã¯ï¼Œn = 2, k = 2 ã§ã‚り,直ã¡ã«å›žè·¯ A ㌠1 ビット目㨠2 ビット目ã®ä¸¡æ–¹ã‚’利用ã—ã¦ã„ã‚‹ã“ã¨ãŒåˆ†ã‹ã‚‹ï¼Žã‚ˆã£ã¦ãƒ—ãƒã‚°ãƒ©ãƒ 㯠1 㨠2 を解ç”ã¨ã—ã¦å‡ºåŠ›ã—ãŸï¼Ž
プãƒã‚°ãƒ©ãƒ ã®å‡ºåŠ› | プãƒã‚°ãƒ©ãƒ ã¸ã®å…¥åŠ› |
---|---|
2 2 | |
!1 2 |