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

news2024/11/17 3:07:05

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

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.coloradmin.cn/o/1396548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu源码安装MySQL

mysql下载路径 创建新数组 mysql sudo groupadd mysql# 创建用户 mysql ,指定属组为 mysql&#xff0c;禁止其登录 # --no-create-home选项&#xff0c;创建用户时不会自动创建主目录 sudo adduser --system --no-create-home --ingroup mysql --shell /sbin/nologin mysql创…

#Pytorch 使用DDP训练第一轮,验证后第二轮卡住

问题&#xff1a;在使用DDP分布式训练的时候&#xff0c;在第一轮训练后验证结果&#xff0c;在第二轮开始时就卡住了。因为设置了dist.barrier()&#xff0c;所以只有第一个GPU跑了验证&#xff0c;在第二轮时只有第一个GPU的模型在&#xff0c;其他卡的模型都被阻塞住了。 解…

NOIP2011提高组day1 - T3:Mayan游戏(玛雅游戏)

题目链接 [NOIP2011 提高组] Mayan 游戏 题目描述 Mayan puzzle 是最近流行起来的一个游戏。游戏界面是一个 7 7 7 行 5 \times5 5 列的棋盘&#xff0c;上面堆放着一些方块&#xff0c;方块不能悬空堆放&#xff0c;即方块必须放在最下面一行&#xff0c;或者放在其他方块…

bug笔记:解决 HTTP Error 500.30 - ASP.NET Core app failed to start

总结下后端部署windos iis环境net6版本&#xff0c;500.30问题报错的一种解决方案&#xff1a; 一、问题描述 二、解决方案 检查下是否安装了net6对应的环境&#xff0c;是否已经安装 然后在事件管理器>Windows日志>应用程序&#xff0c;里面查看详细异常记录 在iis下面…

机器学习平台建设(六)

四、OpenPAI 前文介绍了机器学习平台的功能以及建设机器学习平台要考虑的因素。本节会介绍OpenPAI&#xff0c;即微软的开源机器学习平台。它可用于企业私有部署&#xff0c;也可部署在云平台中。它解决了建模训练时的算力和资源管理的问题。OpenPAI的开发很活跃&#xff0c;问…

工业设备管理系统:助力企业实现数字化转型

随着工业4.0和智能制造的快速发展&#xff0c;数字化转型已成为企业提升竞争力、适应市场变化的必然选择。工业设备管理系统作为数字化转型的关键组成部分&#xff0c;能够为企业提供实时监控、数据分析、预警和远程控制等功能&#xff0c;助力企业实现数字化转型的目标。 一、…

【办公类-21-02】20240118育婴员操作题word打印2.0

作品展示 把12页一套的操作题批量制作10份&#xff0c;便于打印 背景需求 将昨天整理的育婴师操作题共享&#xff0c; 因为题目里面有大量的红蓝颜色文字&#xff0c;中大班办公室都是黑白单面手动翻页打印。只有我待的教务室办公室有彩色打印机打印&#xff08;可以自动双面…

【GPU调用及CUDA安装 看完全会!】使用gpu进行各类训练/运行代码

检查 是否有GPU 打开任务管理器&#xff0c;我这边显示有gpu 查看有没有安装cuda nvidia-smi我没有CUDA 安装CUDA https://developer.nvidia.com/cuda-toolkit-archive 选择自定义安装 不要勾选Visual Studio 记录下面安装目录&#xff0c;如果后续环境变量没有自动…

Docker(五)访问仓库

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 访问仓库 仓库&#xff08;Repository&#xff09;是集中存放镜像的地方。 一个容易混淆的概念是注册服务器&#xff08;Registry&#xf…

Linux下使用Docker部署MinIO实现远程上传

&#x1f4d1;前言 本文主要是Linux下通过Docker部署MinIO存储服务实现远程上传的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#…

【Docker】在Windows操作系统上安装Docker

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

2024-01-15(SpringMVCMybatis)

1.拦截器&#xff1a;如果我们想在多个handler方法(controller中的方法)执行之前或者之后都进行一些处理&#xff0c;甚至某些情况下需要拦截掉&#xff0c;不让handler方法执行&#xff0c;那么就可以使用SpringMVC为我们提供的拦截器。 拦截器和过滤器的区别&#xff1a;过滤…

java使用jsch处理软链接判断是否文件夹

前言 这一次主要是碰到一个问题。因为使用jsch去读取文件的时候&#xff0c;有一些文件它是使用软链接制作的一个映射。因为这里面有一个问题。如果它是软链接你就无法判断他到底是文件。还是文件夹&#xff1f;因为他没有提供可以直接读取的方法&#xff0c;用权限信息去判断…

Freemarker的基本语法及入门基础

freemarker的基本语法及入门基础 一、freemarker模板文件(*.ftl)的基本组成部分 1. 文本&#xff1a;直接输出的内容部分 2. 注释&#xff1a;不会输出的内容&#xff0c;格式为<#-- 注释内容 --> 3. 取值(插值)&#xff1a;代替输出数据模型的…

基于Spring+mybatis+vue的饮食分享系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

INS-06003错误处理

在麒麟V10操作系统上安装Oracle RAC 19C&#xff0c;安装GI的建立互信步骤中&#xff0c;遇到INS-06003错误&#xff1a; [INS-06003] Failed to setup password SSH connectivity with following node(s) 查看详细信息&#xff1a; PRVG-11001: PRCZ-2136: PRCZ-2006: 此时在操…

C++ 设计模式之 中介者模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 -- 什么是中介者模式 &#xff08;第16种模式&#xff09; 中介者模式&#xff08;Medi…

C#控制台相关

CSharp控制台相关 在进行控制台小游戏开发时&#xff0c;常用到的控制台命令代码。 知识点一&#xff1a;输入、输出 重点&#xff1a; char c Console.ReadKey(true).KeyChar; 作用&#xff1a;可以不显示输入的这个字符&#xff0c;并且用c 记录该按键输入的数据。 知…

DC-3靶机刷题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1-P5ezyt5hUbmmGMP4EI7kw?pwdrt2c 提取码&#xff1a;rt2c 参考&#xff1a; http://t.csdnimg.cn/hhPi8https://www.vulnhub.com/entry/dc-32,312/ 官网http://t.csdnimg.cn/5mVZ7DC-3 (1).pdfhttps://…

JAVAEE初阶 网络原理初识

网络原理 一.局域网1.1 局域网组件网络的几种关系 二. 广域网三. 网络通信基础概念3.1 IP3.2 端口3.3 协议3.4 拆分3.5 拆分的优点 四. TCP/IP五层模型4.1 网络设备的分层 一.局域网 局域网是 Local Area Network 简称 LAN。 局域网是本地&#xff0c;局部私自建立的一种网络。…