IsNumberPrime(int num):
if num <= 1: return False
i = 0
end = sqrt(num)
while ArrayOfPrimes[i] <= end:
if (num % ArrayOfPrimes[i]) == 0: return False
i = i + 1
return True
此算法检查给定的数字是否为质数ArrayOfPrimes是包含前1000个质数的数组,如2,3,5,7,11……根据我的方法,由于这个算法将只检查直到给定数字的平方根,所以它应该不会超过sqrt(n)/2,所以我的理解是它应该是sqrt
为什么这个算法具有指数时间复杂度?
我知道"Modulus“是一个按位运算的运算符,对单个位进行运算。因此,在最坏的情况下,我们需要执行sqrt(2^n)除法。这是一种exp时间算法。
如果这是真的,那么所有的算法不会变成指数时间吗?请解释一下。
Find-Factor(X)
1: if X is even then
2: return ”2 is a factor”
3: end if
4: for i = 3 to Sqrt(X) by +2 do
5: test if X%i = 0, if yes, output ”i is a factor”
6: end for
7
我正在编程质数生成器(最多200位)在Pascal使用的。
我已经实现了多个步骤,但我被模幂运算部分卡住了。我选择了,其中(我假设)我必须实现A mod B,其中A和B都是(在最坏的情况下是200位)。为了计算模数,我必须实现最多200位的2个数的除法。我在一个数组中重新表示我的长整数,其中每个元素都是一个数字(0-9)。
我已经在谷歌上搜索过了,但我没有找到任何适合我的算法(这不会花费很多时间来实现)。所以我在这里询问是否有人有这方面的经验。我不一定要成为最快的算法,但它不应该是“愚蠢的”,因为欧几里德除法需要数年时间,而且应该很容易实现。我不想使用任何库(纯pascal)
我试图用matlab编写一个代码,它的功能与内置的fft函数基本相同。因此,计算任意给定输入向量的离散傅里叶变换。
变换给出了
% N
% X(k) = sum x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N.
% n=1
现在,我创建了自己的代码来完成这个任务,但是当我查看计算时间时,计算工作量大约是200因子。显然,我想减少这种情况。
下面是我代码的计算部分,其中y是输出向量。
N=length(input_vector)
for k =
我是C#的初学者,我正在尝试编写一个应用程序来获取用户输入的两个数字之间的素数。问题是:对于较大的数字(有效数字在1到1000000000之间),获得素数需要很长时间,并且根据我正在解决的问题,整个操作必须在很小的时间间隔内执行。这是有关更多说明的问题链接:
下面是我的代码中负责获取质数的部分:
public void GetPrime()
{
int L1 = int.Parse(Limits[0]);
int L2 = int.Parse(Limits[1]);
if (L1 == 1)
我有一段检查给定数字是否为质数的代码:
If x Mod 2 = 0 Then
Return False
End If
For i = 3 To x / 2 + 1 Step 2
If x Mod i = 0 Then
Return False
End If
Next
Return True
我只对numbers 1E7 <= x <= 2E7使用它。然而,它非常慢-我几乎不能一秒检查300个号码,所以检查所有的x需要超过23天的时间……
有没有人能给我一些改进的建议,或者说一下我可能会以这种方式重复做些什么?
设G= (V,E)是一个有向图,以邻接列表格式给出。定义有向图G‘= (V,E'),其中边(u,v)∈E’当且仅当(v,u)∈E(即G‘反转G中每个边的方向)。描述了一种在O时间内求G‘邻接表表示法的算法。
是否有一种简单的方法来反演邻接表?
说如果是:
a-> b
b-> de
c-> c
d-> ab
e->
to:
a-> d
b-> ad
c-> c
d-> ab
e-> b
我必须得到一个素数序列。但是我的代码不能工作。怎么可能修复它呢?
var num1 = parseInt(prompt('Enter a number'));
var num2 = parseInt(prompt('Enter a number'));
var num3 = 0;
function primeSeq(num1, num2) {
var b = 1;
var c = '';
if (num1 > num2) {
num3 = num2;
num2 = num1;
num1 = num3;
}
for (va
我有以下代码来查找树的直径:
ALGORITHM: TREE_DIAMETER (T)
maxlength ← 0
for s ← 0 to s < |V[T]|
do temp ← BSF(T, S)
if maxlength < temp
maxlength ← temp
increment s by 1
return maxlength
但该算法不能在线性时间内运行。尽可能地保留上述代码的细节(例如:使用BSF),是否有可能将其优化为线性时间?您可以使用伪代码。
输入一个数字: 13 预期输出: 13是一个质数。 我正在尝试这种方式->//编写一个程序来确定这个数字是否为质数 #include <stdio.h>
int main(){
//Declaring variables for storing information
int number,count=0;
printf("Enter an integer number : ");
scanf("%d",&number);
//Here, I want to divide the number by 1 up to 100
for(
我已经写了一个函数来同时显示质数和特定数字n的因子。
bool PrimeFactor(int n){
int count = 0;// count divisors
for (int i = 2 ; i < n; i++){
if ( n % i == 0 ){
if ( PrimeFactor(i)){
cout << i << endl;
}
count ++;
}
}
我的老师教我Flash排序算法,它的成本大约是O(n)。在运行这种类型之前,我必须了解数组中哪些元素是最大的,哪些是最小的。
这是我的解决办法:
//n is a size of array a[]
for(int i = 0; i < n ; i++){
if (_max < a[i]) _max = a[i];
if (_min > a[i]) _min = a[i];
}
设f(n)是这个for-循环中的一个条件运算符(比较变量i除外).因此,它的成本:
比较_max和ai的时间
比较_min和ai的时间
因此,f(n) = 2n。
我的朋友写了
下面的方法在未排序的数组中查找整数的最长连续序列。({1,3,2,4,6,5}将返回6):
public static int what(int[] vec) {
int m = 0;
for (int i = 0; i < vec.length; i++) {
int c = 0;
int n = i;
do {
n = find(vec, vec[n]+1);
c++;
} while (n != -1);
if (c > m)