Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convolution のインターフェースを追加 #48

Merged
merged 4 commits into from
Sep 15, 2020

Conversation

terry-u16
Copy link
Contributor

#11 を踏まえ、Convolutionのインターフェースを追加しました。

@terry-u16 terry-u16 mentioned this pull request Sep 14, 2020
@terry-u16
Copy link
Contributor Author

#11 の方針で修正します。

@terry-u16
Copy link
Contributor Author

terry-u16 commented Sep 15, 2020

少々オーバーロード数が多くなりましたが、#11 の通り修正しました。
publicなメソッドは大きく分けて以下の4種類です。

// 1-a. int[], uint[], long[], ulong[] を受け取り、mod 998244353で畳み込み(1-b. の mod 未指定版)
public static int[] Convolution(int[] a, int[] b) => Convolution<Mod998244353>(a, b);

// 1-b. int[], uint[], long[], ulong[] を受け取り、TMod で畳み込み
public static int[] Convolution<TMod>(int[] a, int[] b) 
    where TMod : struct, IStaticMod { }

// 2. ReadOnlySpan<StaticModInt<TMod>>を受け取り、TModで畳み込み
public static Span<StaticModInt<TMod>> Convolution<TMod>(ReadOnlySpan<StaticModInt<TMod>> a, ReadOnlySpan<StaticModInt<TMod>> b)
    where TMod : struct, IStaticMod { }

// 3. ReadOnlySpan<long> を受け取り、mod を取らず畳み込み
public static long[] ConvolutionLong(ReadOnlySpan<long> a, ReadOnlySpan<long> b) { }

基本的には #11 の通りですが、加えて2.の返り値をStaticModInt<TMod>[]からSpan<StaticModInt<TMod>>に変更しています。
畳み込み実施前に配列長を2のべき乗に拡張し、結果を返す前に再度配列長を|a|+|b|-1へとリサイズするのですが、後者の際に無駄なコピーが生じないようSpan<T>.Slice()したものを返すことを意図しています。

よろしくお願いします。

@key-moon
Copy link
Contributor

ありがとうございます…!

変更点についてなのですが、Span を使うつもりがなくMInt[] a, MInt[] bを渡したのにSpanで帰ってきた場合に混乱すると思ったので、

StaticModInt<TMod>[] 
public static StaticModInt<TMod>[] Convolution<TMod>(StaticModInt<TMod>[] a, StaticModInt<TMod>[] b)
    where TMod : struct, IStaticMod { }

public static Span<StaticModInt<TMod>> Convolution<TMod>(ReadOnlySpan<StaticModInt<TMod>> a, ReadOnlySpan<StaticModInt<TMod>> b)
    where TMod : struct, IStaticMod { }

と分けたいなと個人的には感じました。(文字列系もこの挙動に従っています)

どう思いますか…?

@terry-u16
Copy link
Contributor Author

確かにそうですね……賛成です!
追加しますので、少々お待ちください……!

@key-moon
Copy link
Contributor

確認しました🙇

@key-moon key-moon merged commit ce393c4 into kzrnm:master Sep 15, 2020
kzrnm added a commit that referenced this pull request Feb 27, 2022
v1.5.1: Add SuffixArray that takes Span parameter
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants