私は友人の家に夕食に行って、彼らは「素因数ベクトル空間」のアイデアを提案しました。この空間では、正の整数はベクトルとして表現され、ベクトルのn番目の要素はn番目の素数が数を分割する回数になります。(これは、ベクトルに無限の数の項があることを意味することに注意してください。)たとえば、20は
2 0 1 0 0 0 ...
その素因数分解は2 * 2 * 5であるためです。
素因数分解は一意であるため、各数値は1つのベクトルに対応します。
エントリをペアごとに追加することで、ベクトルを追加できます。これは、関連付けられている数値を乗算するのと同じです。また、スカラー乗算を行うこともできます。これは、関連する数値を累乗するようなものです。
問題は、逆行列がないため、この空間は実際にはベクトル空間ではないことです。先に進んで逆行列を追加してベクトル空間を閉じると、すべての正の有理数をベクトルとして表現する方法ができました。ベクトルの加算が乗算を表すという事実を保持する場合。そして、自然数の逆数はその逆数です。
たとえば、数20のベクトルは
2 0 1 0 0 0 ...
したがって、1/20の端数はその逆です
-2 0 -1 0 0 0 ...
我々のような割合に関連したベクトル見つけたい場合は14/15を我々は見つけるだろう14
1 0 0 1 0 0 ...
および1/15
0 -1 -1 0 0 0 ...
そして、ベクトル加算を実行してそれらを乗算します
1 -1 -1 1 0 0 ...
ベクトル空間ができたので、それを修正して内積を与えることにより内積空間を形成することができます。これを行うには、ベクトル空間が古典的に与えられているという内積を盗みます。2つのベクトルの内積は、それらの項のペアごとの乗算の合計として定義されます。たとえば、20・14/15 は次のように計算されます
20 = 2 0 1 0 0 0 ...
14/15 = 1 -1 -1 1 0 0 ...
2 0 -1 0 0 0 ... -> 1
別の例として、製品2/19・4/19
2/19 = 1 0 0 0 0 0 0 -1 0 0 0 ...
4/19 = 2 0 0 0 0 0 0 -1 0 0 0 ...
2 0 0 0 0 0 0 1 0 0 0 ... -> 3
あなたの仕事は、この内積を実行するプログラムを実装することです。正の整数のペア(分子と分母)または有理型(浮動小数点は精度と割り切れる問題を引き起こすため許可されません)のいずれかを介して2つの正の有理数を取り、2つのドット積を表す整数を出力する必要があります入力。
これはコードゴルフであるため、回答はバイト単位で記録され、バイト数は少ない方が良いでしょう。
テストケース
4 · 4 = 4
8 · 8 = 9
10 · 10 = 2
12 · 12 = 5
4 · 1/4 = -4
20 · 14/15 = 1
2/19 · 4/19 = 3