求其啦~是但啦~20101219

在标题上打个日期。。。有点多余~

不知道为什么,心血来潮,想写点东西。。

但真正要写了,又不知道写什么。。

本来今天自习了一天,挺满足的。。。

晚上,疯子问我有限域的内容,不会,感觉那个下午白看了~

最怕这种感觉,似懂,又非懂,尤其在数学上~

挺喜欢数学的,有机会重来的话,说不定就学数学了。。。

但现在,一学期三门数学,讲得飞快。。。

完全为考试而学的样子,不求甚解。。。

很怀念印象中那种属于数学的感觉,很奇妙~

可惜,被糟蹋了。。。

 

想起两部电影,香港拍的,觉得不错。。。

童梦奇缘,还有麦兜故事。。。

在我看来,不错,就是让人回味。。。

总试图参透出当初没看到的内涵~

那些谁都知道的道理~

到了这个年纪,想的就多了~

发情期,好像大家都这样。。。

自己写的split函数

 

int split(char *text,char *x,char **output)
{
    int textlen,xlen,//后面初始化
        pointer=0,//"text"的偏移
        n=0;//output的个数
    textlen=strlen(text);
    xlen=strlen(x);
    
    while(1)
    {
        char *p, *t;
        p=strstr(text+pointer,x);
        if(NULL!=p)*p=0;
        t=(char *)malloc(sizeof(char)*strlen(text+pointer)+4);
        strcpy(t,text+pointer);
        output[n++]=t;
        pointer=p+xlen-text;
        if(NULL==p)break;
    }
    return n;
}

 

数论相关算法(未完)

辗转相除法最大公约数:

//要求a,b不同时为零
int gcd(int a,int b)
{
    if(!b)return a;
    else return gcd(b,a%b);
}

利用最大公约数求最小公倍数:

int lcm(int a,int b)
{
    if(!(a*b))return 0;
    else return a*b/gcd(a,b);
} 

$a^b\mod n$:

int modExp(int a,int b,int n)
{
    int t=1,y=(a%n+n)%n;
    while(b)
    {
            if(b%2==1)t=t*y%n;
            y=y*y%n;
            b/=2;
    }
    return t;
}

扩展的Euclid算法:

//返回a,b的最大公约数d,并使ax+by=d
int ExtEuclid(int a,int b,int *x,int *y)
{
    int d,tmp;
    if(b==0)
    {
            *x=1;
            *y=0;
            return a;
    }
    d=ExtEuclid(b,a%b,x,y);
    tmp=*x;
    *x=*y;
    *y=tmp-a/b*(*x);
    return d;
}

解线性同余方程$ax\equiv b(\mod n):

//返回最小的x...通解是X=x(mod n/d) 
int modularLinerEquation(int a,int b,int n)
{
    int x,y,d;
    d=ExtEuclid(a,n,&x,&y);
    if(b%d!=0)return -1; // no solution
    x=b/d*x;
    x=(x%(n/d)+(n/d))%(n/d);
    return x; 
}

用中国剩余定理解同余方程组$a\equiv b_i(\mod m_i)$:

//用中国剩余定理解线性同与方程组$a\equiv b_i(\mod m_i)$
int solModularEquations(int b[],int m[],int z)
{
    int M=1,i,y,result=0;
    for(i=0;i<z;i++)M*=m[i];
    for(i=0;i<z;i++)
    {
        y=modularLinerEquation(M/m[i],1,m[i]);
        result=(result+y*b[i]*M/m[i])%M;
    }
    return result;
}

Miller-Rabin测试:

//Miller-Rabin素性测试
//令大奇数$n=2^lm+1$,其中l非负整数,m为正奇数.
//若$b^m\equiv 1(\mod n)$或者$b^{2^jm}\equiv -1(\mod n)$ ,0<=j<=l-1
//则称n通过以b为基的miller-rabin测试 
int passMillerRabinTest(int n) 
{
    int l,m;
    m=n-1;
    l=0;
    while(m%2==0)
    {
        l++;
        m/=2;
    }
    
    b=rand()%(n-1)+1;
    
    if(modExp(b,m,n)==1)return 1;
    
    int i,k;
    k=m;
    for(i=0;i<l;i++)
    {
        if(modExp(b,k,n)==n-1)return 1;
        k*=2;
    }
    
    return 0;
}