Tag: 算法

计算pow(a,b)mod n

我想计算一个用于RSA解密的b mod n。 我的代码(如下)返回错误的答案。 这有什么问题? unsigned long int decrypt2(int a,int b,int n) { unsigned long int res = 1; for (int i = 0; i < (b / 2); i++) { res *= ((a * a) % n); res %= n; } if (b % n == 1) res *=a; res %=n; return res; }

查找给定整数的所有精确除数的算法

我想找到一个数字的所有确切除数。 目前我有这个: { int n; int i=2; scanf(“%d”,&n); while(i<=n/2) { if(n%i==0) printf("%d,",i); i++; } getch(); } 有没有办法改善它?

查找已知的整数键集

Gperf在我的环境中一直表现不及Judy数组,我想知道是否还有另一个专门为整数键构建的完美哈希库。 我事先知道了这组键,我想利用它来获得性能/尺寸优势。 有大约1000个密钥,并且检索不按顺序排列。 密钥对都是整数。 密钥为32位,检索值为8位。 尺寸是最重要的因素。 如果有一种方法可以调整Gperf的整数键,或者只是一般的另一种方法,我也是耳朵。 🙂 (旁注:……在输入这个问题的时候,我意识到二元搜索可能会占用蛋糕而我只是过度思考问题。我仍然希望听到你为了学习而有任何想法,虽然!) 编辑:键不均匀分布。 大多数都是在整个可能的范围内随机聚集的。 编辑2:最坏情况下的二进制搜索对我来说太慢了,所以我最后玩了键,直到我发现每个都使用8位来制作256个分布均匀的桶。 我保持每个桶的最小值和最大值(每个桶入口24位),并为密钥对制作了一个大的结构数组。 比我为我的特定情况测试过的其他所有东西都要小,更快,更小,所以我想我现在要用它。 🙂

类似的String算法

我正在寻找一种算法,或者至少是关于如何在两个或多个不同的字符串中找到类似文本的操作理论…… 就像这里提出的问题一样: 查找具有相似文本的文章的算法 ,区别在于我的文本字符串只会是少数单词。 就像说我有一个字符串:“进入清澈的蓝天”,我正在与以下两个字符串进行比较:“颜色是azure色”和“在蓝色晴朗的天空” 我正在寻找一种可用于匹配两者中文本的算法,并决定它们的匹配程度。 在我的情况下,拼写和标点符号将是重要的。 我不希望它们影响发现真实文本的能力。 在上面的例子中,如果颜色参考存储为“’azure色’”,我希望它仍然能够匹配。 但是,列出的第3个字符串应该比第二个字符串更好,等等。 我敢肯定谷歌这样的地方可能会使用类似于“你是不是的意思:”的function…… *编辑* 在与朋友交谈时,他与一位撰写有关该主题的论文的人一起工作。 我想我可能会与阅读此内容的所有人分享,因为其中描述了一些非常好的方法和流程…… 这是他的论文的链接 ,我希望它对那些阅读这个问题的人以及类似字符串算法的主题有所帮助。

如何在高海拔照片中有效地找到地平线?

我试图检测从高空拍摄的图像中的地平线,以确定相机的方向。 我也试图快速运行 – 理想情况下,我希望能够在Raspberry Pi上实时处理帧(即每秒几帧)。 到目前为止我采取的方法是基于这样一个事实:在高海拔地区,天空非常暗,如下: 我试过的是从整个图像中取样并将它们分成浅色和深色样本,并在它们之间画一条线。 然而,由于大气层的模糊性,这将地平线置于其实际位置之上: 这是我的代码(在Javascript中为了便于网络演示): function mag(arr) { return Math.sqrt(arr[0]*arr[0]+arr[1]*arr[1]+arr[2]*arr[2]) } // return (a, b) that minimize // sum_i r_i * (a*x_i+b – y_i)^2 function linear_regression( xy ) { var i, x, y, sumx=0, sumy=0, sumx2=0, sumy2=0, sumxy=0, sumr=0, a, b; for(i=0;i<xy.length;i++) { x = xy[i][0]; y = xy[i][2]; r = […]

链表反递

我正在查看斯坦福图书馆的以下代码: void recursiveReverse(struct node** head_ref) { struct node* first; struct node* rest; /* empty list */ if (*head_ref == NULL) return; /* suppose first = {1, 2, 3}, rest = {2, 3} */ first = *head_ref; rest = first->next; /* List has only one node */ if (rest == NULL) return; /* put the first […]

在C中计算大数的阶乘

在我的C代码中,我想计算1到100范围内的数字的阶乘。对于小数字,该函数可以工作,但对于更大的数字,例如100! 它返回错误的结果。 有什么方法可以处理C中的大数阶因子? 我正在使用的编译器是gcc v4.3.3。 我的代码如下: #include #include double print_solution(int); int main(void) { int no_of_inputs,n ; int ctr = 1; scanf(“%d”,&no_of_inputs); //Read no of inputs do { scanf(“%d”,&n); //Read the input printf(“%.0f\n”,print_solution(n)); ctr++; }while(ctr <= no_of_inputs); return 0; } double print_solution(int n) { if(n == 0 || n == 1) return 1; else return n*print_solution(n-1); […]

以对数时间平行减少

给定n部分和,可以将log2并行步骤中的所有部分和相加。 例如,假设有八个线程具有八个部分和: s0, s1, s2, s3, s4, s5, s6, s7 。 这可以在log2(8) = 3连续步骤中减少; thread0 thread1 thread2 thread4 s0 += s1 s2 += s3 s4 += s5 s6 +=s7 s0 += s2 s4 += s6 s0 += s4 我想用OpenMP做这个,但我不想使用OpenMP的reduction条款。 我想出了一个解决方案,但我认为可以使用OpenMP的task子句找到更好的解决方案。 这比标量加法更通用。 让我选择一个更有用的案例:数组缩减(请参见此处 , 此处以及有关数组缩减的更多信息)。 假设我想在数组a上进行数组缩减。 下面是一些代码,它们为每个线程并行填充私有数组。 int bins = 20; int a[bins]; int **at; // […]

Carrays排序技巧

a=[1,3,6,7,1,2] 哪个是排序以下数组的最佳排序技术,如果有重复,如何处理它们。 也是最好的分拣技术…. void BubbleSort(int a[], int array_size) { int i, j, temp; for (i = 0; i < (array_size – 1); ++i) { for (j = 0; j a[j+1]) { temp = a[j+1]; a[j+1] = a[j]; a[j] = temp; } } } }

在C中构建对数函数而不使用float类型

我需要重写日志函数(基数2或基数10无关紧要),不使用float类型,但我需要得到小数点后几位小数的精度。 (就像一个float * 100在整数类型中得到2 1.4352数,例如:如果1.4352是结果,我的函数应该返回类似143 ( int类型)的东西,我知道最后2个数字是小数。 我在stackoverflow上找到了一些方法,比如: 如何在不使用C#内置数学函数的情况下计算基数为2的对数? 但是所有这些都返回int精度(避免小数)。 我不知道如何处理这个问题,所以问题是: 如何编码(和/或更改)整数log实现以支持十进制结果?