针对JavaLongs中的斐波那契计算显示为负和java斐波那契数这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展10,000项复合的斐波那契式序列、873.最长的斐波那契子序列的长度、C#
针对Java Longs中的斐波那契计算显示为负和java斐波那契数这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展10,000 项复合的斐波那契式序列、873. 最长的斐波那契子序列的长度、C#中的斐波那契、C#中的斐波那契,二进制或二项式堆?[关闭]等相关知识,希望可以帮助到你。
本文目录一览:Java Longs中的斐波那契计算显示为负(java斐波那契数)
我的斐波那契计算器可以正常工作,但是当数值更高时,结果将变为负数,就像Integer
超过最大值一样。
它正在使用缓存java.util.Map<Integer,Long>
。进入的所有内容都与Map
预期的一样,但是当打印出来时,我得到例如291的信息:
-784134397488903422
根据http://www.maths.surrey.ac.uk/hosted-
sites/R.Knott/Fibonacci/fibCalcX.html,应为:
2923602405716568564338475449381171413803636207598822186175234
我的Long
s 似乎出了点问题,但我不确定到底是什么。有人可以指出正确的方向吗?
Map
条目的值:http :
//pastebin.com/uje07Ays
10,000 项复合的斐波那契式序列
如何解决10,000 项复合的斐波那契式序列?
请教我如何优化我的代码...
我正在寻找方程 a*Xn-1 - (c*c)Xn-2
的斐波那契数列。我正在寻找 GCD 为 1 的 a,c
值,这将导致从 10th
项到 10,000th
项复合的斐波那契数列。但是,对于序列中的每个术语,我还希望 term + 1
的值和 term - 1
的值也复合。
随着数字变得非常大,代码需要非常长的时间才能完成。
为了测试素性,我使用了 from sympy.ntheory import isprime
函数。
我没有使用列表,而是使用两个变量来表示我的斐波那契数列。
我正在使用递归来分析较小的间隔并逐渐向上移动到最大值。打印语句应该有助于理解代码在运行时正在做什么。
这是我的代码:
from math import gcd
from sympy.ntheory import isprime
def check_pairs(a_c_pairs,start_checking_from,increment,max):
end_checking_at = start_checking_from + increment
pairs_that_passed_the_composite_test = [] # list of the successful pairs
print()
print(f"{a_c_pairs = }")
print(f"{start_checking_from = },{end_checking_at = },{increment = },{max = }")
print()
print(f"Number of terms to check: {len(a_c_pairs)}")
count = 1
for a,c in a_c_pairs: # checking for each of the provided pairs
print(f"{count}/{len(a_c_pairs)}: {a=},{c=},result=",end="")
count += 1
first_term = 0
second_term = 1
fail = False
# iterating through each term in the sequence without using a list
for i in range(end_checking_at):
third_term = a*second_term - (c*c)*first_term
if not i < start_checking_from: # if the term is in our targeted range,check if that term is prime
if isprime(third_term) or isprime(third_term + 1) or isprime(third_term - 1):
fail = True
print("FAIL")
break
# set values for the loop to calculate the next term in the sequence
first_term = second_term
second_term = third_term
if not fail: # after the entire sequence has been analyzed,if none of the terms were prime
print("pass")
pairs_that_passed_the_composite_test.append([a,c])
if not end_checking_at == max:
check_pairs(pairs_that_passed_the_composite_test,start_checking_from + increment,max)
else:
print()
print("FINAL LIST OF PAirs:")
for a,c in pairs_that_passed_the_composite_test:
print(a,c)
return
# these pairs have passed up to 3000 terms
a_c_pairs = [
[11,3],[34,[37,[38,[40,[41,[53,[56,[59,[61,[65,[71,[77,[82,[89,[94,[95,[98,5],[39,[42,[43,[46,[51,[54,[57,[64,[73,[74,[86,[91,7],[55,[75,[79,[81,[83,[87,[92,[99,[100,9],[97,9]
]
check_pairs(a_c_pairs,2000,500,3000)
解决方法
检查一个数是否为质数对于大数来说是很昂贵的。虽然有像 AKS 这样具有多项式复杂度的算法来做到这一点,但多项式的 很大(即 O(n^7)
其中 n
是测试数字 N 的大小,以位为单位)。非确定性算法的多项式复杂度较低,但这仍然相当大。例如,Miller Rabin 检验可以在 O(n^4)
中做到这一点,假设未经证实的广义黎曼假设为真(目前看来确实如此)。对于像 64 位拟合这样的中等大数,您只能检查少数几个碱基,从而进行快速素性测试。对于庞大的数字,研究人员正在积极致力于设计更好的算法(尤其是确定性通才无条件测试)并寻找此类算法的理论算法复杂度界限。不幸的是,AFAIK O(n^4)
接近于测试一个数字是否为合数的最著名的复杂性(没有任何巨大的隐藏常数)。
问题是斐波那契数列增长非常快。对于标准版本,表示第 i 个元素的位数接近 2 i / 3
。因此,i = 10 000
的计算时间将相当长,因为它需要处理大约 6700 位的数字,在最坏的情况下(即质数)需要数百万次迭代。目前还没有主流计算机能够做到这一点(而且可能在未来 20 年内都无法做到)。
解决这个问题的唯一可能解决方案是设计一个特定的素性测试您生成的数字,乍一看似乎是一项非常艰巨的任务。如果素数和斐波那契数之间没有关系,那么没有比使用最先进的算法(在您的情况下太慢)更好的解决方案。否则,如果有任何关系,这样的问题在堆栈溢出上是题外话,但您可以在 math.stackexchange.com 上提出这个问题。
注意事项:
如果 third_term-1
是偶数,则只需要检查 third_term
(因为其他不是质数)。如果 third_term-1
是奇数,则 third_term
不是素数,third_term-1
或 third_term+1
都不是素数。此外,请注意 GCD 与斐波那契数之间存在关系,GCD 与质数之间也存在关系,因此斐波那契数与质数之间可能存在关系。
873. 最长的斐波那契子序列的长度
如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的:
n >= 3
对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}
给定一个严格递增的正整数数组形成序列,找到 A 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。
(回想一下,子序列是从原序列 A 中派生出来的,它从 A 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一个子序列)
示例 1:
输入: [1,2,3,4,5,6,7,8]
输出: 5
解释:
最长的斐波那契式子序列为:[1,2,3,5,8] 。
示例 2:
输入: [1,3,7,11,12,14,18]
输出: 3
解释:
最长的斐波那契式子序列有:
[1,11,12],[3,11,14] 以及 [7,11,18] 。
如果直接使用遍历算法的话,时间复杂度大概是O(n^3)这个数量级,而题目要求中给出的数组A的最大长度为1000,如果使用O(n^3)的算法,势必会超时。
考虑如何简化:斐波那契数列有一个性质,即一但前两个数字确定,整个数列即确定的。故我们使用二维数组来存储这一信息, 二维数组map的两个索引分别为该斐波那契数列前两个数在A中的索引,其对应的值为由该数列在整个序列中的最大长度。
我们只要从后往前遍历整个数组,就能使用到map中所储存的信息,具体代码如下:
代码:
class Solution {
public int lenLongestFibSubseq(int[] A) {
int res = 0;
// HashMap<Integer, Integer []> map = new HashMap<Integer, Integer[]>();
int [][] map = new int [A.length][A.length];
map[A.length- 2][A.length -1] = 2;
// List <Integer> list = new ArrayList<>();
// for(int i = 0 ; i < A.length ; i++){
// list.add(A[i]);
// }
for(int j = A.length - 3; j >= 0; j--){
for(int i = j + 1; i <A.length; i++){
int three = A[j] + A[i];
int index = findIndex(i, three , A);
if(index != -1) {
map[j][i] = map[i][index] +1;
res = Math.max(map[j][i], res);
}else{
map[j][i] = 2;
}
}
}
return res < 3 ? 0: res;
}
public int findIndex(int start, int target, int [] A) {
int end = A.length -1;
while(start <= end) {
int mid = (start + end) / 2;
if(A[mid] < target) {
start = mid +1;
}else if(A[mid] > target) {
end = mid - 1;
}else {
return mid;
}
}
return -1;
}
}
C#中的斐波那契
您可以尝试使用以下示例中显示的方法。您可以使用string.Join()
正确显示数组
有很多教程介绍了递归。也许有时会在YouTube上查找教程。干杯!
public static IEnumerable<int> FibonacciSeries(int numOfElems)
{
var numList = new List<int>();
int n1 = 0,n2 = 1,n3,i;
//adding 0 and 1
numList.Add(0);
numList.Add(1);
for (i = 2; i < numOfElems; ++i) //loop starts from 2 because 0 and 1 are already added
{
n3 = n1 + n2;
numList.Add(n3);
n1 = n2;
n2 = n3;
}
return numList;
}
C#中的斐波那契,二进制或二项式堆?[关闭]
是否有斐波那契,二进制或二项式的堆数据结构实现?
参考:这些是用于实现优先级队列的数据结构,而不是用于分配动态内存的数据结构。参见http://en.wikipedia.org/wiki/Heap_(data_structure)
谢谢戴夫
答案1
小编典典我不知道任何本机框架实现。
我在f#中找到了两个二进制堆的实现(链接1,链接2)和一个二项堆的实现(链接)。
关于Java Longs中的斐波那契计算显示为负和java斐波那契数的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于10,000 项复合的斐波那契式序列、873. 最长的斐波那契子序列的长度、C#中的斐波那契、C#中的斐波那契,二进制或二项式堆?[关闭]的相关知识,请在本站寻找。
本文标签: