-
Notifications
You must be signed in to change notification settings - Fork 6
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
Math/Convolution #11
Comments
C++版の // 1. modをテンプレート引数で受け取り、T型のvectorについて畳み込みを行う。Tはint, uint, ll, ull。
vector<T> convolution<int m = 998244353>(const vector<T>& a, const vector<T>& b)
// 2. static_modint型のvectorについて畳み込みを行う。引数はコピーされるため、呼び出し側のvectorは変更されない。
vector<static_modint<m>> convolution<int m>(vector<static_modint<m>> a, vector<static_modint<m>> b)
// 3. ll型のvectorについて、modを取らず畳み込みを行う。
vector<ll> convolution_ll(const vector<ll>& a, const vector<ll>& b) これをできる限り踏襲すると、C#版に移植するなら以下のようなインターフェースが考えられるかなと思っています。 // 1. int, uint, long, ulong に対応させるため INumOperator<T> を使用。modを引数で受け取り、内部でDynamicModInt<T>を使う。
// 利用しやすいよう、別途int, uint, long, ulong版のオーバーロードを作成してラップする。
TValue[] Convoluton<TValue, TOp>(ReadOnlySpan<TValue> a, ReadOnlySpan<TValue> b, int mod)
where TValue : struct
where TOp : struct, INumOperator<TValue> { }
// 2. StaticModInt<T>のSpanを受け取る。C++に合わせ、内部でa, bをコピーしてから計算。
StaticModInt<T>[] Convolution<T>(ReadOnlySpan<StaticModInt<T>> a, ReadOnlySpan<StaticModInt<T>> b)
where T : struct, IStaticMod { }
// 3. C++版の通り。
long[] ConvolutionLong(ReadOnlySpan<long> a, ReadOnlySpan<long> b) { } 2.と3.についてはC++版とほとんど変わりません。2.でmodをテンプレート引数で受け取るか、
あたりがちょっと辛いところです。 TValue[] Convoluton<TValue, TOp, TMod>(ReadOnlySpan<TValue> a, ReadOnlySpan<TValue> b)
where TValue : struct
where TOp : struct, INumOperator<TValue>
where TMod : struct, IStaticMod{ } のようにすれば解決するのですが、C++では1.が「 何かご意見頂ければ嬉しいです……! |
冷静に考えると、1.は とはいえmod周りの問題についてはまだ残っているので悩んでいます。いっそ1.をなくしてしまっても良いような気もしますが……。 |
DynamicModInt が StaticModInt にパフォーマンスで劣るのと同じように、1.に関してはパフォーマンスに目をつむって中身をDynamicModIntで実装するのが、一番使いやすく元のC++コードにも近くなるのかなと思います。 |
ありがとうございます……!内部実装はともかく、インターフェース部分はC++版に合わせたいですね。 |
C++のModintを知らなくても使えるという制約については、恐らくテンプレート引数は知っているが演算子のオーバーロードあたりを知らない、という層を想定していると思います。そのため、このような実装ならば十分な知識量で対応できると感じます。
のような実装をすれば解決するはずです。 |
|
確かに型引数として渡すだけであれば特に難解でもないですね。 こちらの方針で修正してみます。どうもありがとうございました……! #48 |
インターフェース部分を修正しました。 #48 |
No description provided.
The text was updated successfully, but these errors were encountered: