略解
一般性を失わず, y1<=y2<=...<=ynとして良いです.
また, N=1の時は自明にYESです.[例えば,(a,b)=(y0⊕x0,0)とすれば良いです.]
加えて,bが0以上という条件も無視して良いです.
なぜなら,2つの整数のペア(ただし 0≤a) (a,b)が仮に暗号データを完全に再現するならば,
十分大きい任意の整数rに対して(a+2r,b+2r)も条件を満たすからです.
以下では2≤Nかつy1<=y2<=...<=ynを仮定し, bの正負に関しては考えないものとします.
このとき,キーの存在性は
▷(a⊕xj)−(a⊕x0)=yj−y0{for all 1≤i<N} を満たすkeyが存在する
と同値であることは明らかです.
仮に条件を満たすkeyがあると仮定し,aを上位ビットから決定してゆくことを考えます.
V=[0,y1−y0,...yn−y0]
と定義します.(これは,あくまで各要素においてy0との差分を収めた配列であり,ビットの変化に合わせて動的に変化してゆくことに注意します.)
さて,aのbit目が 0/1と仮定した時, Vはどのように更新されるかを考えます.
初めに,M= 十分大きいビット桁数として, Mビットより上は全てのビットが0としてしまって良いです.
r=M,M−1,....0の順にaのrビット目を確定させてゆきます.
この時,解が存在するならば,以下のループ不変条件が成り立つ必要があります.
◉ [−2r+1<x<2r+1for all x in V]
[証明は略しますが,簡単にその概要を述べると,仮に命題を否定すると最終的にVの要素で0にすることができないものが存在するという背理法によるものです
]
逆にこれがr=0終了時まで保たれれば,それは十分条件でもあり,最終的に解が存在することと同値です.
またこの時, 条件を満たすためにaのrビット目がどちらになるかはループ不変条件を保つための必要条件から一意に定まります.
これらのことから,各rについてr=0まで条件に違反しないかどうかO(N)程度で判定できることがわかります.
Mは十分大きくとしましたが,具体的にはM=log(max(yi−y0))程度でよいのでM=60とすれば
全体に要する計算時間量はO(MN)です.
[余談]
y=(a⊕x)−bの場合,解は無限に存在するか0かのいずれかです.
ですが, y=(a⊕x)+bの場合,解は明らかに有限しか存在しません.
このとき,上記の考え方を更新すれば,全ての解の個数を求め,なおかつ,列挙することができます.
(ただし,その個数分の時間/計算コストは必要になります.)
難易度はやや上がりますが考えてみてください.