相关疑难解决方法(0)

在C中,为什么"signed int"比"unsigned int"更快?

在C中,为什么signed int速度比unsigned int?是的,我知道这个网站已被多次询问和回答(链接如下).但是,大多数人说没有区别.我编写了代码并意外地发现了显着的性能差异.

为什么我的代码的"未签名"版本比"签名"版本慢(即使在测试相同的数字时)?(我有一个x86-64英特尔处理器).

类似的链接

编译命令: gcc -Wall -Wextra -pedantic -O3 -Wl,-O3 -g0 -ggdb0 -s -fwhole-program -funroll-loops -pthread -pipe -ffunction-sections -fdata-sections -std=c11 -o ./test ./test.c && strip --strip-all --strip-unneeded --remove-section=.note --remove-section=.comment ./test


signed int

注意:如果我明确声明signed int所有数字,则没有区别.

int isprime(int num) {
    // Test if a signed int is prime
    int i;
    if (num % 2 == 0 || num % 3 == 0)
        return 0;
    else if (num % 5 == …
Run Code Online (Sandbox Code Playgroud)

c optimization performance unsigned signed

30
推荐指数
3
解决办法
4672
查看次数

用于生成素数的并行算法(可能使用Hadoop的map reduce)

生成素数是一个玩具问题,我经常不时尝试,特别是在尝试新的编程语言,平台或风格时.

我正在考虑尝试使用Hadoop(Map Reduce)编写素数生成算法或素数测试算法.

我想我会发布这个问题,以获得提示,参考,算法,方法.

虽然我的主要兴趣是基于Map Reduce的算法,但我不介意查看新的Hadoop编程模型或者例如查看使用PiCloud

我在Prime数字生成中似乎有一些有趣的问题:这里,这里这里,但没有任何与Parallel方法相关的问题引起了我的注意.

提前致谢.

parallel-processing primes hadoop mpi number-theory

14
推荐指数
1
解决办法
6829
查看次数

使用OpenMP"无效控制谓词"编译器错误

我正在创建一个基本的素数检查器,基于C - 确定一个数字是否为素数 ,但是使用OpenMP.

int isPrime(int value)
{
    omp_set_num_threads(4);

    #pragma omp parallel for 
    for( int j = 2;  j * j <= value; j++)
    {
    if ( value % j == 0) return 0;
    }
    return value;
}
Run Code Online (Sandbox Code Playgroud)

使用-fopenmp进行编译时,GCC版本4.7.2 出错,说明invalid controlling predicatefor循环.

看起来这个错误是由for循环中的j平方引起的.有没有办法解决这个问题,仍然可以从算法中获得所需的输出?

c openmp

10
推荐指数
2
解决办法
1万
查看次数

试验部门对素性的条件测试

我的问题是关于试验部门的条件测试.关于采用什么条件测试似乎存在争议.我们来看看RosettaCode的代码 .

int is_prime(unsigned int n)
{
    unsigned int p;
    if (!(n & 1) || n < 2 ) return n == 2;

    /* comparing p*p <= n can overflow */
    for (p = 3; p <= n/p; p += 2)
        if (!(n % p)) return 0;
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

车轮分解或使用预定的素数列表不会改变我的问题的本质.

我可以想到三种情况来进行条件测试:

  1. P <= N/P
  2. P*P <= N
  3. int cut = sqrt(n); for(p = 3; p <= cut; p + = 2)

案例1:适用于所有n但它必须在每次迭代时进行额外的除法(编辑:实际上它不需要额外的除法但它仍然较慢.我不知道为什么.请参阅下面的汇编输出).我发现它的速度是情况2的两倍,因为大的n值是素数(在我的Sandy Bridge系统上).

案例2:明显快于案例1,但它有一个问题,它溢出大n并进入一个不定式循环.它可以处理的最大值是

(sqrt(n) …
Run Code Online (Sandbox Code Playgroud)

c math floating-point primes

8
推荐指数
1
解决办法
765
查看次数

C - 如果是素数,如何轻松测试?

可能重复:
C - 确定数字是否为素数

有没有办法在C中轻松测试所选数字是否为素数?

c

3
推荐指数
2
解决办法
4万
查看次数

C中的素数

int prime(unsigned long long n){
    unsigned val=1, divisor=7;
    if(n==2 || n==3) return 1; //n=2, n=3 (special cases).
    if(n<2 || !(n%2 && n%3)) return 0; //if(n<2 || n%2==0 || n%3==0) return 0;
    for(; divisor<=n/divisor; val++, divisor=6*val+1) //all primes take the form 6*k(+ or -)1, k[1, n).
        if(!(n%divisor && n%(divisor-2))) return 0; //if(n%divisor==0 || n%(divisor-2)==0) return 0;
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是朋友为获得素数而写的东西.它似乎正在使用某种筛分,但我不确定它是如何起作用的.下面的代码是我不那么棒的版本.我会用sqrt我的循环,但我看到他做了其他事情(可能是筛选相关),所以我没有打扰.

int prime( unsigned long long n ){
    unsigned i=5;
    if(n < 4 && n > 0)
        return 1;
    if(n<=0 …
Run Code Online (Sandbox Code Playgroud)

c numbers division sieve trial

3
推荐指数
1
解决办法
1502
查看次数

考虑一个代码来显示一个数字是素数还是非素数?

现在我在编译方面遇到了新代码的问题.我有两个很好的答案,但chux的答案是为了纠正我的代码.所以根据他/她的指示我的新代码是:

#include <math.h>
#include <conio.h>
int main()
{
    int n,i,r;

    printf("Enter A Number to know its prime or non prime");
    scanf("%d",&n);
    for(i=2;i<=n-1;i++)
    {
        if(n%i==0) 
        {r==1;
        break;
    }
    }

    if(r==1)
    printf("%d is a non-prime number",n);
    else 
        printf("%d is a prime number",n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

但在输出上显示为87是素数.我不知道为什么.但有人能发现我的错误吗?

c

1
推荐指数
1
解决办法
68
查看次数