同余幂

介绍了一种利用指数的二进制展开来高效计算同余幂(b^nmodm)的方法,并给出了具体的伪代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

曾经因为一道题研究了一下同余幂,然而当时貌似找了一个模板一样的东西,至于原理什么的还是没有太清楚,今天看离散的时候研究了一下和大家分享一下。

目前求同余幂(b^n mod m)可行的方法是利用指数n的二进制展开的算法。其基本的原理就是

   b^n =b^(a[k-1]*2^(k-1)+……a[1]*2 + a[0])

      =b^(a[k-1]*2^[k-1]) ……b^(a[1]*2) b^a[0]

为了计算b^n,我们找到b, b^2,(b^2)^2,……b^(2^k)的值,把其中a[j] = 1的那些项b^(2^j)(ps:不是1的是0都没了)乘起来,就得到了b^n的值。

之后依次求b mod m, b^2 mod m,……,b^(2^(k-1)) mod m,把其中的a[j] = 1的那些项b^(2^j) mod m乘起来,在每次乘法后求乘积 mod m。

一下是同余幂的伪代码

procedure 同余幂 (b:整数,n = (a[k-1]a[k-2]……a[1]a[0])2 ,m:正整数)

x:=1

power:= b mod m

for  i:=0 to k –1

begin

     if a[i] = 1then x:= (x*power) mod m

     power :=(power*power) mod m

end

{x等于b^n mod m}

 

这个算法是非常高效的,进行O((log m)^2 *logn)次位运算

至于这个是怎么求的……这个嘛给点小提示可以自己硬算(没费多少事)也可以联想乘法运算那个是O(log m*log n),因为b的指数的位运算就是乘法运算,这样之后就恨容易看出来了吧。

至于以前的那个同余幂实际上在while的时候就是转换二进制,大家可以查看一下。

本文写的有点乱如果有错误请大家及时给予我指正,谢谢。

 

1.学生结构体如下: typedef struct { char id[20]; // 学号(字符串形式,避免前导零问题) char name[50]; // 姓名 char gender; // 性别('M' 或 'F') char className[30]; // 班级 } Student; 2.学生信息随机生成 姓氏由以下中随机:"赵","钱","孙","李","周","吴","郑","王","冯","陈","褚","卫","蒋","沈","韩","杨","朱","秦","尤","许","何","吕","施","张","孔","曹","严","华","金","魏","陶","姜","戚","谢","邹","喻","柏","水","窦","章","云","苏","潘","葛","奚","范","彭","郎","鲁","韦","昌","马","苗","凤","花","方","俞","任","袁","柳","酆","鲍","史","唐","费","廉","岑","薛","雷","贺","倪","汤","滕","殷","罗","毕","郝","邬","安","常","乐","于","时","傅","皮","卞","齐","康","伍","","昝","管","卢","莫","经","房","裘","缪","干","解","应","宗","丁","宣","贲","邓","郁","单","杭","洪","包","诸","左","石","崔","吉","钮","龚","程","嵇","邢","滑","裴","陆","荣","翁","荀","羊","於","惠","甄","麴","家","封","芮","羿","储","靳","汲","邴","糜","松","井","段","富","巫","乌","焦","巴","弓","牧","隗","山","谷","车","侯","宓","蓬","全","郗","班","仰","秋","仲","伊","宫","宁","仇","栾","暴","甘","钭","厉","戎","祖","武","符","刘"(用数组包括) 名由以下随机:"伟", "芳", "娜", "敏", "静","纶和","京先","幽欢","泉钦","韵謙", "兼芳","聪甜","诺事","湘虹","宜天","闻网","翠兆","骏洋","传晟","方恩","享月","兆极","益恩","品玲","典心","理顷","虹圆","汇均","简臣","晏志", "清祖","继阳","博璟","实勋","杰皓","荣格","莲良","贝玉","斌嘉","廷永", "扬敏","静孝","垚聪","蒂才","政晖","邦优","菁昇","中跃","丝长","貴坚", "讯临","鹏宁","哲珍","能图","城昂","富长","亭衡","萌睿","莲锐","梅萱","平锦","川赫","晓悦","芹东","曲楚","灿俊","涵广","欣频","开柯","昙"(用数组包括) 学号为7位数字,不可重复; 班级格式为:XX(专业)X班(专业包括:"计算机", "软件工程", "网络工程", "信息安全", "人工智能" , "临床医学", "商务英语, "材料物理", "材料化学", "食品科学与工程", "土木工程", "汉语言" ,每个专业有1~8班); 性别随机生成; 要求:1.代码用C语言编写,随机函数用时间布种子,每个小功能包括询问生成数量,生成学生信息等都封装成函数;并给出超详细注释 2.用户输入生成多少学生信息,随机生成多少学生信息,提示生成成功,可进一步选择查看生成的所有学生信息。学生信息用数组保存;最多2000个学生;3:生成成功后,用户选择是否保存学生信息,如是,生成名为“dataAll”的txt文件存储;用户开始使用程序时若选择读取上次数据,则直接调用“dataAll”的txt文件;再问用户要生成多少学生信息。
最新发布
03-23
首先,我们需要定义一个“文本编辑器”类来实现宻事宺的宼单宸宲。代码如下: ```java public class TextEditor { private String content; // 文本编辑器中的内容 // 构造函数 public TextEditor() { content = ""; } // 复制 public void copy() { // 将选中的文本复制到剪贴板 } // 粘贴 public void paste() { // 将剪贴板中的文本粘贴到文本编辑器中 } // 设置字体大小 public void setFontSize(int size) { // 将文本编辑器中的字体大小设置为指定大小 } // 设置字体样式 public void setFontStyle(String style) { // 将文本编辑器中的字体样式设置为指定样式 } // 设置字体颜色 public void setFontColor(String color) { // 将文本编辑器中的字体颜色设置为指定颜色 } // 获取文本编辑器中的内容 public String getContent() { return content; } // 设置文本编辑器中的内容 public void setContent(String content) { this.content = content; } } ``` 接下来,我们可以在主函数中创建一个 TextEditor 对象,然后调用相应的方法来实现宼单宸宲。例如: ```java public static void main(String[] args) { TextEditor editor = new TextEditor(); editor.setContent("Hello, world!"); // 复制并粘贴 editor.copy(); editor.paste(); // 设置字体大小、样式和颜色 editor.setFontSize(18); editor.setFontStyle("italic"); editor.setFontColor("red"); // 输出结果 System.out.println(editor.getContent()); } ``` 这样,我们就实现了一个简单的文本编辑器,可以进行复制、粘贴和设置字体大小、样式和颜色等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值