私はファイバーn mod mを見つけるために速いアルゴリズムを見つけるために壁に頭を当てています。フィボナッチ数nをmで割った余りはです。 :、私のコードは動作し、この試験でフィボナッチn mod mを見つけるためのより速いアルゴリズム
Input: 281621358815590 30524 // n and m
Output: 11963
:1 < = N = 10^18、例として2 < = M < = 10^5
<は、Iは以下のように与えられていテストは次のように失敗します。 100 100000
これは私のコードである:fibmod()
で
import java.math.BigInteger;
import java.util.Scanner;
public class FibonacciHuge {
private static BigInteger fibmod(long n, BigInteger m) {
BigInteger a=BigInteger.ZERO;
BigInteger b=BigInteger.ONE;
BigInteger c;
long i;
for (i=2; i<=n;i++){
c=a.add(b);
a=b;
b=c;
}
return b.mod(m);
}
private static BigInteger fibComplex (long n, BigInteger m) {
int count = 2;
for (int i = 2; i < (m.pow(2)).longValue()-1; i++) {
long a2=fibmod(i+1,m).longValueExact();
long a3=fibmod(i+2,m).longValueExact();
count= count+1;
if (a2==0 && a3==1){
break;
}
}
return fibmod(n % count,m);
}
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
long n = in.nextLong();
BigInteger m = in.nextBigInteger();
System.out.println(fibComplex(n,m));
in.close();
}
}
、Iはn個のフィボナッチを見つけ、最後に私は、変調器としてMを使用します。 fibComplex()
では、私はピサニ期間の長さを見つけると仮定しているので、n % (lengthofPisaniPeriod)
の残りにreduce nを使用して、mod mを適用します(nはそれほど大きくはありません)。 Javaの場合、これは1.5秒で実行する必要がありますが、Pisaniの大きなピリオド(100,000)ではあまりにも多すぎます。 友人の中には、最初にFib nを見つけずに、最後にピリオドの長さを見つけ、先端を使ってnをn % (length of period)
の残りの部分に減らすことなくそれをしたと言った人もいます。
私は最も速いフィボナッチアルゴリズムhereを検索しましたが、解決方法は簡単です。前に説明したように、nを減らす方法は簡単ですが、3日後に概念を把握できます。私はのBigIntegerで働いているが、その本当に必要な場合は、ヒントが言うので、私は、わからない。この問題で
」
、与えられた数n個のn回の反復のためにループ本当に巨大したがって アルゴリズムであってもよいです。 については1秒に収まりませんので、このようなループを避ける必要があります。
hereピサニサイクル/ピリオド計算機を見つけることができます。大きな数字でも速く動作するので、どのアルゴリズムを使用しているかわかります。
申し訳ありません私の質問に何かが明確でない場合、それは午前11時と私はこれを解決しようと眠っていません。私はそれを編集することができますので、より明確に必要な場合は数時間の睡眠を取ることができます。
正確に 'BigInteger'を使っていますか? – greybeard
r = n%(lengthPisaniPeriod)に設定しても、rは93よりも大きい場合があります。つまり、fib(r)は長いプリミティブよりも大きくなります。 – Nooblhu