所以我最近一直在努力实施Miller-Rabin素性测试.我将它限制在所有32位数字的范围内,因为这是一个非常有趣的项目,我正在做的是熟悉c ++,我不想使用64位的任何东西.一会儿.另外一个好处是该算法对于所有32位数字都是确定性的,因此我可以显着提高效率,因为我确切知道要测试的证人.
因此对于较低的数字,该算法工作得非常好.但是,该过程的一部分依赖于模幂运算,即(num ^ pow)%mod.所以,例如,
3 ^ 2 % 5 =
9 % 5 =
4
Run Code Online (Sandbox Code Playgroud)
这是我用于此模幂运算的代码:
unsigned mod_pow(unsigned num, unsigned pow, unsigned mod)
{
unsigned test;
for(test = 1; pow; pow >>= 1)
{
if (pow & 1)
test = (test * num) % mod;
num = (num * num) % mod;
}
return test;
}
Run Code Online (Sandbox Code Playgroud)
正如您可能已经猜到的那样,当参数都是特别大的数字时会出现问题.例如,如果我想测试数字673109的素数,我将在某一点上必须找到:
(2 ^ 168277)%673109
现在2 ^ 168277是一个特别大的数字,并且在过程的某个地方它溢出测试,这导致不正确的评估.
在反面,诸如的论点
4000111222 ^ 3%1608
由于同样的原因,也评估不正确.
有没有人对模块取幂有一些建议,可以防止这种溢出和/或操纵它产生正确的结果?(我看到它的方式,溢出只是模数的另一种形式,即num%(UINT_MAX + 1))
我已经开发了一个使用pandas和scikit的垃圾邮件分类器,以便能够集成到基于hadoop的系统中.为此,我需要将分类器导出为比酸洗更常见的格式.
预测模型标记语言(PMML)是我首选的导出格式.它与我们已经使用的Cascading非常匹配.但是,我出乎意料地找不到任何将scikit-learn模型导出到PMML中的python库.
有没有人有过这个用例的经验?是否有任何替代PMML可以提供scikit-learn和hadoop之间的互操作性?固态PMML导出库怎么样?
最近我一直在研究使用Atve的Sieve(http://en.wikipedia.org/wiki/Sieve_of_atkin)生成其素数的C++素数生成器.我的目标是能够生成任何32位数字.我将主要用于项目的euler问题.大多数情况下,这只是一个夏季项目.
该程序使用一个位板来存储素数:即一系列的1和0,例如第11位将是1,第12位是0,第13位是1等.为了有效的内存使用,这实际上是和字符数组,每个字符包含8位.我使用标志和按位运算符来设置和检索位.该算法的陀螺很简单:使用我不假装理解的一些方程式进行第一次传递,以定义数字是否被认为是"素数".这将在很大程度上得到正确的答案,但一些非主要数字将被标记为素数.因此,在遍历列表时,将刚刚找到的素数的所有倍数设置为"非素数".这具有便利的优点,即需要较少的处理器时间,而素数越大.
我已经完成了90%,只有一个问题:一些素数缺失.
通过检查位板,我已经确定在第一次传递期间省略了这些素数,这基本上为每个方程式切换一个数字(参见维基百科条目).我一次又一次地浏览了这段代码.我甚至尝试增加维基百科文章中显示的界限,效率较低,但我想可能会打几个我已经忽略的数字.没有任何效果.这些数字只是评估为不是素数.我的大部分测试都是在128以下的所有质数下.在这个范围内,这些是省略的素数:
23和59.
我毫不怀疑,在更高的范围内,会有更多的缺失(只是不想计算所有这些).我不知道为什么缺少这些,但它们是.这两个素数有什么特别之处吗?我已经进行了两次和三次检查,发现并修复了错误,但是我仍然缺少一些愚蠢的东西.
无论如何,这是我的代码:
#include <iostream>
#include <limits.h>
#include <math.h>
using namespace std;
const unsigned short DWORD_BITS = 8;
unsigned char flag(const unsigned char);
void printBinary(unsigned char);
class PrimeGen
{
public:
unsigned char* sieve;
unsigned sievelen;
unsigned limit;
unsigned bookmark;
PrimeGen(const unsigned);
void firstPass();
unsigned next();
bool getBit(const unsigned);
void onBit(const unsigned);
void offBit(const unsigned);
void switchBit(const unsigned);
void printBoard();
};
PrimeGen::PrimeGen(const unsigned max_num)
{
limit = max_num;
sievelen = limit / DWORD_BITS + 1; …
Run Code Online (Sandbox Code Playgroud) 作为一个侧面项目,我正在研究一些自制的素数问题,尝试编写一些不同的实现作为自学C和C++的方法.当然,生成低质数的最快方法是已经拥有它们,所以我想设置一个硬盘主列表数据文件.我想编写所有生成素数的代码,但我对使用已经存储的方法没有任何疑虑.在实际编码方面,我的经验很少,但理解大部分理论.(请注意,对于大部分内容,我将讨论数学整数,而不是int变量)
所以我向你们提出一些问题,专家们:
1)天真的方法只是在生成时对二进制写整数.但是,在我脑海中,我想象一个列表,其中的项目由某种标志分隔,因此可以存储大于32位的整数(如果我到达那一点).这显然是低效的,但是数组[4723,12782,8357]的原始数据看起来像4723F12782F8357,即数字存储在十进制中,每位16位,并用F分隔.显然,ABCDE数字可能性的数据将不被使用,因此它不是一个非常有效的系统,但你明白我的意思.随着数字越来越长,这也会变得越来越有意义,因为在任何固定长度系统中任何一个最小的条目都必须与最大的条目一样大.我确信必须有用C或C++编写的能够有效地完成这项工作的东西.
2)另一种可能性是长度声明系统,其中在存储每个整数之前,固定长度(假设1字节)数据片段声明整数将以多长时间(以位为单位).这显然与前一个选项具有相似的优点,并且不会浪费数字可能性.
有谁知道如何存储这种数据?是否有一个变量类型,我可以存储素数,以免进入大小限制?更好的是,以简单可检索的格式将简单的整数列表存储到硬盘的最有效方法是什么?
嘿所有,所以我试图构建一个简单的二叉树,它有两个键,并评估其排序的总和.这是它的样子:
struct SumNode
{
int keyA;
int keyB;
SumNode *left;
SumNode *right;
};
class SumBTree
{
public:
SumBTree();
~SumBTree();
void insert(int, int);
SumNode *search(int, int);
SumNode *search(int);
void destroy_tree();
private:
SumNode *root;
void insert(int,int, SumNode*);
SumNode *search(int,int, SumNode*);
SumNode *search(int, SumNode*);
void destroy_tree(SumNode*);
};
SumBTree::SumBTree()
{
root = NULL;
}
SumBTree::~SumBTree(){};
void SumBTree::insert(int a, int b, SumNode *leaf)
{
int sum = a + b;
int leafsum = leaf->keyA + leaf->keyB;
if (sum < leafsum)
{
if (leaf->left != NULL) …
Run Code Online (Sandbox Code Playgroud) 我在使用pearsonr
SciPy 的方法时遇到了一些问题.我试着让它尽可能简单(注意华丽的N ^ 2循环),但我仍然遇到了这个问题.我不完全明白我哪里出错了.我的数组正确选择,并具有相同的维度.
我运行的代码是:
from scipy import stats
from sklearn.preprocessing import LabelBinarizer, Binarizer
from sklearn.feature_extraction.text import CountVectorizer
ny_cluster = LabelBinarizer().fit_transform(ny_raw.clusterid.values)
ny_vocab = Binarizer().fit_transform(CountVectorizer().fit_transform(ny_raw.text.values))
ny_vc_phi = np.zeros((ny_vocab.shape[1], ny_cluster.shape[1]))
for i in xrange(ny_vc_phi.shape[0]):
for j in xrange(ny_vc_phi.shape[1]):
ny_vc_phi[i,j] = stats.pearsonr(ny_vocab[:,i].todense(), ny_cluster[:,j])[0]
Run Code Online (Sandbox Code Playgroud)
哪会产生错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/data/TweetClusters/TweetsLocationBayesClf/<ipython-input-29-ff1c3ac4156d> in <module>()
3 for i in xrange(ny_vc_phi.shape[0]):
4 for j in xrange(ny_vc_phi.shape[1]):
----> 5 ny_vc_phi[i,j] = stats.pearsonr(ny_vocab[:,i].todense(), ny_cluster[:,j])[0]
6
/usr/lib/python2.7/dist-packages/scipy/stats/stats.pyc in pearsonr(x, y)
2201 # Presumably, if abs(r) > …
Run Code Online (Sandbox Code Playgroud)