编程同余
❶ pascal编程:同余方程
var a,b,x,y,k:longint;
function exgcd(a,b:longint; var x,y:longint):longint;
var t:longint;
begin
if b=0 then
begin x:=1;y:=0;exit(a);end;
exgcd:=exgcd(b,a mod b,x,y);
t:=x;
x:=y;
y:=t-(a div b)*y;
end;
begin
readln(a,b);
k:=exgcd(a,b,x,y);
writeln((x+b)mod b);
end.
求采纳谢谢
❷ 编程的时候随机事件是怎么实现的
一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数,下面是两种方法:
一般种子可以以当前的系统时间,这是完全随机的
VB的种子就是系统时间
算法1:平方取中法
1)将种子设为X0,并mod 10000得到4位数
2)将它平方得到一个8位数(不足8位时前面补0)
3)取中间的4位数可得到下一个4位随机数X1
4)重复1-3步,即可产生多个随机数
这个算法的一个主要缺点是最终它会退化成0,不能继续产生随机数。
算法2:线性同余法 LCG(Linear Congruence Generator)
1)将种子设为X0,
2)用一个算法X(n+1)=(a*X(n)+b) mod c产生X(n+1)
一般将c取得很大,可产生0到c-1之间的伪随机数
该算法的一个缺点是会出现循环。
❸ 一次同余式方程怎么解 127*x=833(mod 1012)
解:∵(127,1012)=1 ((a,b)表示a和b的最大公因数)
且(127,1012)│833 (a│b表示b被a整除)
∴127x≡833 (mod 1012) 有解,且只有1个解。
∵7*127x≡7*833≡771 (mod 1012)
==>(1012-123)x≡771 (mod 1012)
==>-123x≡771 (mod 1012)
==>123x≡-771≡241 (mod 1012)
==>8*123x≡241*8≡-96 (mod 1012)
==>(1012-28)x≡-96 (mod 1012)
==>-28x≡-96 (mod 1012)
==>28x≡96 (mod 1012)
又(28,1012)=4,且4│96
∴28x≡96 (mod 1012)与7x≡24 (mod 253)的解是一致。对于模1012只有4
个解,对于模253有1个解。
∵36*7x≡24*36≡105 (mod 253)
==>(253-1)x≡105≡-148 (mod 253)
==>-x≡-148 (mod 253)
==>x≡148 (mod 253)
∴28x≡96 (mod 1012)的4个解是 x≡148,401,654,907 (mod 1012)
经验算,x≡907 (mod 1012)是127x≡833 (mod 1012) 的解。
故同余式127x≡833 (mod 1012) 的解是x≡907 (mod 1012)。
❹ 请问一次同余式所有整数解的求法需要计算公式。谢谢。
请问一次同余式所有整数解的求法?需要计算公式。答:
首先,ax==b mod m
与不定方程ax=b+ym完全等效。
如果它们有公约数,或约去,求解后,再转化为模m的形式。如x==r mod n
转为x==r+n*i mod kn, i=0,…,k-1。
如果gcd(a,m) |b不成立,则无解。
公式一:
显然,如果有解,约去公约数,则必然可转化为gcd(a,m)=1的情况。此时很容易得到公式解。
依欧拉定理, gcd(a,m)=1,则a^Φ(m)==1 mod m.于是a*a^(Φ(m)-1)==1 mod m,即
x==a^(Φ(m)-1) mod m.
这种方法在巧妙的编程方式下,用电脑计算,不失为一种好手段。通常是将Φ(m)-1二进制化,再将多个积项取余,求积。用其他数制或其他思路计算,也行。如何方便如何算。利用洪伯阳同余表示,手算也较方便。
思路二:这种思路我是独创。用熟了很节省书写,思路也很明确。总之很便捷。
利用同余思想,在不定方程两边同时取余,再将倍数集中得到系数减小的另一不定方程。(与原式比较,得到的比较式方程,可以反映出两者的简单的系数关系。)
如此一直到可以看出特解为止。再根据比较式回代。
更多内容,请网络搜索:
wsktuuytyh 同余式
或
wsktuuytyh 不定方程
思路三:
ax==b mod m,gcd(a,m)=1
将模数分解为m=m1*m2*...*mn,(互质(互素)的多个因数)以它们分别为模解出结果。再逆求同余式组。逆解同余式组也不难。对于中国剩余定理,我有简化方案。
可网络搜索:wsktuuytyh 模积计数法
对m为大合数的情况,这种逆求法有一定用处。
以下谈m为质数或其幂的情况
简单的情况,可以取一个与m互素的数k, 得到kax==kb mod m
而ka mod m为一个较小或较好的值,简化为 ux==kb==v mod m
再设法使as-ut==1,再将s,t作用于两个同余式,即得解答。
当然也可以得到另外两个,或多个类似的同余式,让他们线性叠加,使左边x的系数为1即得解。
利用洪伯阳表示来描述和计算,可以使这个过程十分简洁和高效。可以利用比例的性质、带分数的性质来处理同余式。
进一步利用矩阵,可以将线性叠加描述得更简洁。
相关资料,可搜索
wsktuuytyh 洪伯阳 带分数
对于不太复杂的情况,用洪伯阳表述,不用线性叠加的手段就可以方便的求得解答。
❺ 中国剩余定理用什么程序可以编程,求程序
用什么编程软件都可以编程.只要明白了剩余定理的原理,再针对问题,选择自己擅长的编程语言就可以了.
中国剩余定理一般指孙子定理:孙子定理是中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。又称中国余数定理。一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学着作《孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。《孙子算经》中首次提到了同余方程组问题,以及以上具体问题的解法,因此在中文数学文献中也会将中国剩余定理称为孙子定理。
三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。
除以3余2和除以7余2的数可以写成21n+2。
21n+2除以5余3,要求21n除以5余1。
21n除以5余1,21除以5余1,要求n除以5余1(乘数之余等于余数之乘),则n最小取1。
所以满足“除以3余2,除以5余3,除以7余2”的最小的数是21×1+2=23。
标准解法:先从3和5、3和7、5和7的公倍数中相应地找出分别被7、5、3除均余1的较小数15、21、70 ( 注释:此步又称为求"模逆"运算,利用扩展欧几里得法并借助计算机编程可比较快速地求得.当然,对于很小的数,可以直接死算 )。即
15÷7=2……余1,
21÷5=4……余1,
70÷3=23……余1.
再用找到的三个较小数分别乘以所要求的数被7、5、3除所得的余数的积连加,
15×2+21×3+70×2=233. (将233处用i代替,用程序可以求出)
最后用和233除以3、5、7三个除数的最小公倍数.
233÷105=2……余23,
这个余数23就是合乎条件的最小数.
针对这个问题,用计算机来解决,可以用最简单的穷举法,下面上C语言代码
#include<stdio.h>
intmain()
{
inta=3,b=5,c=7;
inti=7,flag=1;
while(flag)
{
i++;
if(i%7==2&&i%5==3&&i%3==2)//满足条件即输出,并设置退出循环标志
{
printf("所求最小值为%d ",i);
flag=0;
}
}
return0;
}
❻ C语言编程:下面要求的题目怎么做
应用同余定理,可以比较简单地求出。其实是个老题目,说法略不同而已——

代码文本:
#include "stdio.h"
int main(int argc,char *argv[]){
int n,m,ans,i;
printf("Please enter n & m(int n,m>0)... ");
if(scanf("%d%d",&n,&m)==2 && n>0 && m>0){
ans=0;
for(i=1;i<=n;i++)
ans=(ans+m)%i;
printf(" The result is %d ",ans%n+1);
}
else
printf("Input error, exit... ");
return 0;
}
❼ C语言 编写程序利用rand()函数产生50个100以内的随机数,将其中的奇数写入当前目录下的"A.TXT"文件中
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int i,j;
int x[50];
int n=50;
FILE *fp;
srand((unsigned)time(NULL));
// 用当前时间来产生随机数种子,这样每次用本程序产生的随机数序列 将不同,更随机。
for(i=0;i<n;i++) {
x[i] = rand() % 100; // 产生 0-99 之间的随机数,% 是整除 取余数 运算
}
fp=fopen("A.TXT","w"); //打开文件
for(i=0;i<n;i++) {
if (x[i]%2==1) fprintf(fp,"%d\n",x[i]); // 除2余数为1的是奇数,输出它
}
fclose(fp); //关闭文件
printf("the 50 rand numbers:\n");
for(i=0;i<n;i++) {printf("%2d ",x[i]); if ( (i+1)%10==0) printf("\n");} // 屏幕输出这50个随机数
printf("\nOdd rand numbers are saved in A.TXT\n");
return 0;
}
