C#,因数分解(质因子分解)Pollard‘s Rho算法的源代码

因数分解(也称为质因子分解):将一个大整数分解它的质因子之乘积的算法。

Pollard Rho算法的基本思路:先判断当前数是否是素数(质数),如果是,则直接返回。如果不是,继续找到当前数的一个因子(可以不是质因子)。然后递归对该因子和约去这个因子的另一个因子进行分解。

运行效果:

源代码:

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    /// <summary>
    /// 用Pollard-Rho算法求合成质数因子
    /// </summary>
    public static class Prime_Factorization
    {
        /// <summary>
        /// 随机数发生器
        /// </summary>
        private static Random rand = new Random((int)DateTime.Now.Ticks);

        /// <summary>
        /// 计算 x 幂取模
        /// </summary>
        /// <param name="x"></param>
        /// <param name="exponent"></param>
        /// <param name="modulus"></param>
        /// <returns></returns>
        private static long ModularPow(long x, int exponent, long modulus)
        {
            long result = 1;
            while (exponent > 0)
            {
                // 如果 y 是奇数!
                if ((exponent % 2) == 1)
                {
                    result = (result * x) % modulus;
                }
                exponent = (exponent >> 1);

                x = (x * x) % modulus;
            }
            return result;
        }

        /// <summary>
        /// 计算 n 的分解质因子(除)算法
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        public static long PollardRho(long n)
        {
            if (n == 1)
            {
                return n;
            }
            // 偶数
            if ((n % 2) == 0)
            {
                return 2;
            }

            // 设置一个取值范围
            long x = (long)(rand.Next(0, -(int)n + 1));
            long y = x;

            long c = (long)(rand.Next(1, -(int)n));

            // 初始化候选除数(或结果),直到未获得素数因子。
            long d = 1L;
            while (d == 1)
            {
                x = (ModularPow(x, 2, n) + c + n) % n;

                y = (ModularPow(y, 2, n) + c + n) % n;
                y = (ModularPow(y, 2, n) + c + n) % n;

                d = GCD(Math.Abs(x - y), n);

                if (d == n)
                {
                    return PollardRho(n);
                }
            }

            return d;
        }

        public static long GCD(long a, long b)
        {
            return ((b == 0) ? a : GCD(b, (a % b)));
        }

    }
}
 

---------------------------------------------------------------------

POWER BY 315SOFT.COM

TRUFFER.CN

using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{/// <summary>/// 用Pollard-Rho算法求合成质数因子/// </summary>public static class Prime_Factorization{/// <summary>/// 随机数发生器/// </summary>private static Random rand = new Random((int)DateTime.Now.Ticks);/// <summary>/// 计算 x 幂取模/// </summary>/// <param name="x"></param>/// <param name="exponent"></param>/// <param name="modulus"></param>/// <returns></returns>private static long ModularPow(long x, int exponent, long modulus){long result = 1;while (exponent > 0){// 如果 y 是奇数!if ((exponent % 2) == 1){result = (result * x) % modulus;}exponent = (exponent >> 1);x = (x * x) % modulus;}return result;}/// <summary>/// 计算 n 的分解质因子(除)算法/// </summary>/// <param name="n"></param>/// <returns></returns>public static long PollardRho(long n){if (n == 1){return n;}// 偶数if ((n % 2) == 0){return 2;}// 设置一个取值范围long x = (long)(rand.Next(0, -(int)n + 1));long y = x;long c = (long)(rand.Next(1, -(int)n));// 初始化候选除数(或结果),直到未获得素数因子。long d = 1L;while (d == 1){x = (ModularPow(x, 2, n) + c + n) % n;y = (ModularPow(y, 2, n) + c + n) % n;y = (ModularPow(y, 2, n) + c + n) % n;d = GCD(Math.Abs(x - y), n);if (d == n){return PollardRho(n);}}return d;}public static long GCD(long a, long b){return ((b == 0) ? a : GCD(b, (a % b)));}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/417603.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ入门篇【图文并茂,超级详细】

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 前言 1.什么是MQ 2.理解MQ 3.生活…

什么是安全SCDN,有什么作用?

前两天有个站长被朋友推荐联系到了德迅云安全&#xff0c;想要对自己网站做一些安全防护&#xff0c;聊天中问及到了安全SCDN是什么意思&#xff0c;有哪些作用&#xff1f;那么德迅云安全今天就来简单讲述一下安全SCDN&#xff0c;来了解下什么是安全SCDN&#xff0c;以及它有…

JVM:Java类加载机制

Java类加载机制的全过程&#xff1a; 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的&#xff0c;类型的加载过程必须按照这种顺序按部就班地开始&#xff0c;而解析阶段则不一定&#xff1a;它在某些情况下可以在初始化阶段之后再开始&#xff0c; 这是为了支持Java…

10 个优化技巧,减少 Docker 镜像大小

什么是 docker? Docker 是一种容器引擎,可以在容器内运行一段代码。Docker 镜像是在任何地方运行您的应用程序而无需担心应用程序依赖性的方式。 要构建镜像,docker 使用一个名为 Dockerfile 的文件。Dockerfile 是一个包含许多指令(RUN、COPY、EXPOSE 等)的文件。成功执…

索引的概述和性能分析

索引index&#xff0c;是一种有序的数据结构&#xff0c;可以高效的获取数据&#xff0c;在数据库中维护着满足查找特定算法的数据结构&#xff0c;就是索引 无索引的情况&#xff0c;查询数据时会全表扫描&#xff0c;效率极低 索引结构 &#xff08;1&#xff09;二叉树&…

防火墙部署安全区域

目录 为什么需要安全区域在防火墙上如何来区分不同的网络将接口划分到安全区域安全区域、受信任程度与安全级别安全域间、安全策略与报文流动的方向 安全区域配置案例 为什么需要安全区域 防火墙主要部署在网络边界起到隔离的作用 在防火墙上如何来区分不同的网络 防火墙通过安…

力扣36. 有效的数独

模拟 思路&#xff1a; 使用三个哈希表来存储数字个数 row[r][val] 用于存储第 r 行 val 1 的个数&#xff1b;column[c][val] 用于存储第 c 列 val 1 的个数&#xff1b; subboxes[i][j][val] 用于存储第 i 行、第 j 列个小九宫格 val 1 的个数&#xff0c;其中&#xff1…

大模型学习与实践笔记(七)

一、环境配置 1.平台&#xff1a; Ubuntu Anaconda CUDA/CUDNN 8GB nvidia显卡 2.安装 # 构建虚拟环境 conda create --name xtuner0.1.9 python3.10 -y # 拉取 0.1.9 的版本源码 git clone -b v0.1.9 https://github.com/InternLM/xtuner# 从源码安装 XTuner pip insta…

matlab抽取与插值

什么是抽取&#xff1f; 我们假设一个数字信号 x ( n ) , n 1 , 2 , . . . , N x(n),n1,2,...,N x(n),n1,2,...,N共有 N N N个点&#xff0c;抽取就是每个几个点抽1个点&#xff0c;比如2倍抽取&#xff0c;那么抽取后的信号为 y ( n ) , y ( 1 ) x ( 1 ) , y ( 2 ) x ( 3 …

SpringSecurity Web 权限方案

目录 一、设置登录系统的账号、密码 二、数据库查询用户名密码 三、自定义登录页面 四、基于角色或权限进行访问控制 &#xff08;一&#xff09;hasAuthority 方法 &#xff08;二&#xff09;hasAnyAuthority 方法 &#xff08;三&#xff09;hasRole 方法 &#xff…

SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例

文章目录 SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例Dubbo定义其核心部分包含: 工作原理为什么要用dubbo各个节点角色说明&#xff1a;调用关系说明&#xff1a; dubbo为什么需要和zookeeper结合使用&#xff0c;zookeeper在dubbo体系中起到什么作用&…

Linux 部署

jdk&tomcat安装 1.上传jdk、tomcat安装包 2.解压两个工具包 #解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 3.配置并且测试jdk安装 #配置环境变量 vim /etc/profile #java environment export JAVA_HOME/root/soft/…