library_for_python

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Kazun1998/library_for_python

:heavy_check_mark: Xor Convolution
(Convolution/XOR_Convolution.py)

Outline

以降では $N$ を正の整数とし, $(\!(M)\!)$ を $N$ 未満の非負整数全体の集合とする. つまり, $(\!(M)\!)=\{0,1,2 \dots, M-1\}$ である.

長さ $2^N$ の数列 $A=(A_i)_{0 \leq i \lt 2^N}, B=(B_j)_{0 \leq j \lt 2^N}$ に対し, $A,B$ の Xor Convolution $A \oplus B$ を

\[A \oplus B:=\left(\sum_{\substack{0 \leq i,j \lt 2^N \\ i ~\oplus~ j=k}} A_i B_j \right)_{0 \leq k \lt 2^N}\]

と定義する.

なお, 写像 $\operatorname{bit}: \mathcal{P}((\!(N)\!)) \to (\!(2^N)\!)$ を

\[\operatorname{bit}(S):=\sum_{a \in S} 2^a\]

と定義すると, $\operatorname{bit}$ はこの2つモノイド $((\!(2^N)\!), \oplus), (\mathcal{P}((\!(N)\!)), \triangle)$ 間の同型写像になることから, 次のような言い換えができる.

$A,B$ は添字集合が $\mathcal{P}((\!(N)\!))$ である列であるとする. このとき, $A=(A_S)_{S \in \mathcal{P}((\!(N)\!))}, B=(B_T)_{T \in \mathcal{P}((\!(N)\!))}$ の Xor Convolution $A \oplus B$ を

\[A \oplus B:=\left(\sum_{\substack{S,T \in \mathcal{P}((\!(N)\!)) \\ S \triangle T=U}} A_S B_T \right)_{U \in \mathcal{P}((\!(N)\!))}\]

と定義する.

Verified with

Code

def Fast_Walsh_Hadamard_Transform_XOR(A):
    """ XOR に関する Walsh_Hadamard_Transform を行う.

    A: List
    """

    N=len(A)
    h=(N-1).bit_length()
    for k in range(h):
        bit=1<<k
        for i in range(N):
            if i&bit==0:
                x=A[i]
                y=A[i|bit]
                A[i]=(x+y)%Mod
                A[i|bit]=(x-y)%Mod

def Fast_Inverse_Walsh_Hadamard_Transform_XOR(A):
    """ XOR に関する逆 Walsh_Hadamard_Transform を行う.

    A: List
    """

    Fast_Walsh_Hadamard_Transform_XOR(A)
    N_inv=pow(len(A), -1, Mod)
    for i in range(len(A)):
        A[i] = (A[i] * N_inv) % Mod

def Convolution_XOR(A,B):
    """ XOR 演算に関する畳込みを行う.

    A,B: List
    """

    N=len(A); M=len(B)
    L=1<<(max(N,M)-1).bit_length()

    if min(N,M)<64:
        C=[0]*L
        for i in range(N):
            for j in range(M):
                C[i^j]+=A[i]*B[j]
                C[i^j]%=Mod
        return C

    A=A+[0]*(L-N)
    B=B+[0]*(L-M)

    Fast_Walsh_Hadamard_Transform_XOR(A)
    Fast_Walsh_Hadamard_Transform_XOR(B)

    for i in range(N):
        A[i]*=B[i]
        A[i]%=Mod

    Fast_Inverse_Walsh_Hadamard_Transform_XOR(A)
    return A

def Convolution_Power_XOR(A,k):
    """ XOR 演算に関する k 回の畳込みを行う.

    A,B: List
    """

    N=len(A)
    L=1<<(N-1).bit_length()

    A=A+[0]*(L-N)

    Fast_Walsh_Hadamard_Transform_XOR(A)

    A=[pow(A[i],k,Mod) for i in range(L)]

    Fast_Inverse_Walsh_Hadamard_Transform_XOR(A)
    return A

Mod=998244353
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/onlinejudge_verify/documentation/build.py", line 71, in _render_source_code_stat
    bundled_code = language.bundle(stat.path, basedir=basedir, options={'include_paths': [basedir]}).decode()
                   ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/onlinejudge_verify/languages/python.py", line 96, in bundle
    raise NotImplementedError
NotImplementedError
Back to top page