有理数のp進ノルムを計算する
入力として3つの整数m,n,p
(ここでp
は正の素数)を取り|m/n|_p
、(完全に縮小された)分数としてp進ノルム(で示される)を出力する関数またはプログラムを作成します。Fermatのマージンは非常に小さいことが知られていますが、かなり不明な点は、コンピューターの画面が非常に小さいことです。したがって、コードをできるだけ短くして、Fermatの画面に収まるようにしてください。
定義
プライム考えるとp
、すべての画分は、m/n
一意のように(サイン無視して)書き込むことができ(a/b)* p^e
、そのようなe
整数でp
除算どちらa
もがb
。のp進ノルムはm/n
ですp^-e
。小数部が0の場合、特別なケースがあります|0|_p = 0
。
出力形式は次のとおりである必要がありますx/y
(たとえば1/3
、整数の場合は両方10
または同等10/1
に許可され、負の数の場合は先頭にマイナスが必要です(例-1/3
)
詳細
プログラムはstdin / stdoutを使用するか、有理数または文字列を返す関数のみで構成する必要があります。入力m/n
が完全に削減されていないと想定する必要があります。あなたはそれp
が素数であると仮定することができます。プログラムは、間の整数を処理できなければならない-2^28
まで2^28
、10秒以上を取るべきではありません。
組み込みの因数分解と素数チェック機能は許可されていません。また、組み込みの基本会話、およびp進の評価またはノルムを計算する組み込み関数も許可されていません。
例(wikipediaから盗まれた):
x = m/n = 63/550 = 2^-1 * 3^2 * 5^-2 * 7 * 11^-1
|x|_2 = 2
|x|_3 = 1/9
|x|_5 = 25
|x|_7 = 1/7
|x|_11 = 11
|x|_13 = 1
面白いトリビア
(この課題を知っている/読む必要はありませんが、動機として読むのがいいかもしれません。)
(間違った言葉を使ったり、他の何かが間違っている場合、英語でこれについて話すことに慣れていません。)
有理数をフィールドとして考えると、p進ノルムはp進メトリックを誘導しますd_p(a,b) = |a-b|_p
。次に、このメトリックに関してこのフィールドを完成させることができます。つまり、すべてのコーシーシーケンスが収束する新しいフィールドを構築できます。これは、あるべきトポロジカルプロパティです。(たとえば、有理数にはありませんが、実数にはあります。)これらのp進数は、ご想像のとおり、数論で多く使用されています。
別の興味深い結果はオストロウスキーの定理です。これは基本的に、有理数の絶対値(以下で定義)は次の3つのいずれかです。
- 些細なこと:
|x|=0 iff x=0, |x|=1 otherwise
- 標準(実際):
|x| = x if x>=0, |x| = -x if x<0
- p進(定義したとおり)。
絶対値 / メトリックは、距離と見なすものの単なる一般化です。絶対値|.|
は次の条件を満たします。
|x| >= 0 and |x|=0 if x=0
|xy| = |x| |y|
|x+y| <= |x|+|y|
絶対値からメトリックを簡単に構築できることに注意してください。|x| := d(0,x)
またはd(x,y) := |x-y|
、その逆も同様です。つまり、加算 / 減算 / 乗算(整数ドメイン内)できる場合、それらはほぼ同じです。もちろん、この構造を使用せずに、より一般的なセットでメトリックを定義できます。
|x|_11 = 11
になりますか?それとも11
大丈夫ですか?そして、それはx=0
ケースを処理する必要がありますか?
x=0
大文字と小文字を処理する必要があります。この例では11
、同様に出力できます11/1
が、印刷する必要はありません|x|_11
。
PadicNorm
機能もあると思いますか?:P