关于将一个数分解成四个数平方和的算法matlab

2023-05-16

目录

理论基础

拉格朗日四平方数和定理

高斯恒等式

操作步骤

分解质因数

求解四平方数

应用高斯恒等式

小结

高斯恒等式输出代码

输出结果

运行结果


怎么把一个大数分解成四个小数的平方和呢?

理论基础

拉格朗日四平方数和定理

每个正整数都可以表示为至多四个正整数的平方和。或者是,每个正整数都可以表示为四个整数的平方和形式。

2 = 0^2 + 0^2 + 1^2 + 1^2

10 = 0^2 + 0^2 +1^2 + 3^2

1234 = 30^2 + 18^2 + 3^2 + 1^2

在历史上也出现过二平方和定理和三平方和定理。证明方式是二次剩余法,或二次互反律,这里不加以证明。

在已知了拉格朗日四平方和定理的基础上,可以通过枚举,累加的方式通过四层循环来寻找满足条件的四个数。

但是在数字比较大的时候,四层循环是很费劲的,十分耗时。那么我们可以用分解质因数的方式,先把大数分解成若干个质因数的乘积,求出质因数的四平方和,然后再通过质因数的四数求出大数大的四数。

高斯恒等式

如果有正整数x和y,

x = x1^2+x2^2+x3^2+x4^2
y = y1^2+y2^2+y3^2+y4^2

那么
x*y = z1^2+z2^2+z3^2+z4^2
 z1 = x1*y1+x2*y1+x3*y1+x4*y1
 z1 = x1*y2-x2*y1+x3*y4-x4*y3
 z1 = x1*y3-x2*y4-x3*y1+x4*y2
 z1 = x1*y4+x2*y3-x3*y2-x4*y1

矩阵形式

     1     1     1     1
     2    -1     4    -3
     3    -4    -1     2
     4     3    -2    -1
学过高数的同学可以用矩阵乘法推一下。

在有了高斯恒等式之后,我们就可以按照步骤来做了。

操作步骤

第一步分解质因数

分解质因数

分解质因数的方式已经在上一篇文章,讲欧拉定理的时候讲过了。感兴趣的同学可以去看一看。还是一样的方法,先高斯筛质数,然后通过能不能整除,来判断质因数。

%计算一个数的质因数
function e = EULER_E(n)
isnot_prime = zeros(1 , n);%判断是否是合数
prime = [];%质数集
primen = [];%质因数集
if(n == 1)
    e = 1;
    return;
end
for i = 2:n
    if (isnot_prime(i) == 0)
        prime(end + 1) = i;
    end
    for j = 1 : length(prime)
        if((i*(prime(j))>n))
            break;
        end
        isnot_prime(i*(prime(j))) = 1;
        if(mod(i , prime(j)) == 0)
            break;
        end
    end
end
for k = 1:length(prime)
    if(mod(n , prime(k)) == 0)
        primen(end + 1) = prime(k);
    end
end
e = primen;

下一步,求解质因数的四平方数。

求解四平方数

用四层循环嵌套的方式来求。通过暴力破解的累加法。同时为了节省时间,可以只循环到sqrt(n),即根号n,同时也可以用字典排列的方式来节省时间,比如第一层循环为i = 1:n,第二层可以是j = 1:i;依此类推。

代码如下:

%计算一个数的四个平方和数(拉格朗日四平方数定理)
function f = FOUR_number_Square_and(n)
for i = 0 : floor(sqrt(n))
    for j = 0 : floor(sqrt(n))
        for k = 0 : floor(sqrt(n))
            for l = 0 : floor(sqrt(n))
                if((i^2 + j^2 + k^2 + l^2) == n)
                    f = [i , j , k , l];
                end
            end
        end
    end
end

 第三步,应用高斯恒等式。

应用高斯恒等式

这一步内容比较多。首先要判断n = q1^a1+q2^a2+...+qn^an ,各个质因数的次数。

然后,用高斯恒等式,分别先将每个质因数都乘一次,然后再去乘以多余的次数。

代码如下:

%拉格朗日四平方数定理实验
clc;clear;
w = input('n = ');FNSA = [];FNSA_X = [];n = w;prime = [];
primen = EULER_E(w);count = zeros(1 ,length(primen));
for i = 1 : length(primen)
    k = 0;
    while (mod(n , primen(i)) == 0)
        n = n/primen(i);
        k = k + 1;
    end
    count(i) = k;
end
for i = 1 : length(primen)
    temp = FOUR_number_Square_and(primen(i));
    for j = 1 : 4
        FNSA(end+1) = temp(j);
    end
end
for i = 1 : length(primen)
    if(i == 1)
        temp = primen(1);
        for k = 1:4
            FNSA_X(end+1) = FNSA(k);
            tempn = FNSA_X;
        end
        continue;
    end
    temp = primen(i)*temp;
    FNSA_X(1) = abs(FNSA(4*i-3)*tempn(1)+FNSA(4*i-2)*tempn(2)+FNSA(4*i-1)*tempn(3)+FNSA(4*i)*tempn(4));
    FNSA_X(2) = abs(FNSA(4*i-3)*tempn(2)-FNSA(4*i-2)*tempn(1)+FNSA(4*i-1)*tempn(4)-FNSA(4*i)*tempn(3));
    FNSA_X(3) = abs(FNSA(4*i-3)*tempn(3)-FNSA(4*i-2)*tempn(4)-FNSA(4*i-1)*tempn(1)+FNSA(4*i)*tempn(2));
    FNSA_X(4) = abs(FNSA(4*i-3)*tempn(4)+FNSA(4*i-2)*tempn(3)-FNSA(4*i-1)*tempn(2)-FNSA(4*i)*tempn(1));
    tempn = FNSA_X;
end
for j = 1 : length(count)
    while(count(j)>1)
        count(j) = count(j) - 1;
        FNSA_X(1) = abs(FNSA(4*j-3)*tempn(1)+FNSA(4*j-2)*tempn(2)+FNSA(4*j-1)*tempn(3)+FNSA(4*j)*tempn(4));
        FNSA_X(2) = abs(FNSA(4*j-3)*tempn(2)-FNSA(4*j-2)*tempn(1)+FNSA(4*j-1)*tempn(4)-FNSA(4*j)*tempn(3));
        FNSA_X(3) = abs(FNSA(4*j-3)*tempn(3)-FNSA(4*j-2)*tempn(4)-FNSA(4*j-1)*tempn(1)+FNSA(4*j)*tempn(2));
        FNSA_X(4) = abs(FNSA(4*j-3)*tempn(4)+FNSA(4*j-2)*tempn(3)-FNSA(4*j-1)*tempn(2)-FNSA(4*j)*tempn(1));
        tempn = FNSA_X;
    end
end
temp = 0;
for j = 1:4
    temp = temp + FNSA_X(j)^2;
end
if(temp == w)
    fprintf('r %d %d %d %d',FNSA_X(1),FNSA_X(2),FNSA_X(3),FNSA_X(4));
else
    fprintf('w --%d --%d %d %d &d',temp ,FNSA_X(1),FNSA_X(2),FNSA_X(3),FNSA_X(4));
end

小结

对于高斯恒等式在代码里通过矩阵表示会简洁一些。

完整代码就是上面三个代码。两个函数,一个主程序。

另外在编辑的过程中,写高斯恒等式来费劲啦!!!小编就写了一个程序来输出高斯恒等式,为了减少没及时保存而重打一次的工作量。算是没用的小代码吧。

高斯恒等式输出代码

%打印高斯恒等式
clc;clear;
A = [1,1,1,1;2,-1,4,-3;3,-4,-1,2;4,3,-2,-1];
disp(A);
fprintf('x = ');
for i = 1 : 4
    fprintf('x%d^2',i);
    if(i ~= 4)
        fprintf('+');
    else
        fprintf('\n');
    end
end
fprintf('y = ');
for j = 1 : 4
    fprintf('y%d^2',j);
    if(j ~= 4)
        fprintf('+');
    else
        fprintf('\n');
    end
end
 fprintf('x*y = ');
 for k = 1  : 4
    fprintf('z%d^2',k);
    if(k ~= 4)
        fprintf('+');
    end
 end
for i = 1 : 4
    for j = 1 : 4
        if (j == 1)
            fprintf('\n z%d = ',j);
        end
        if(j ~= 1)
            if(A(i , j)>0)
                fprintf('+');
            else
                fprintf('-');
            end
        end
        fprintf('x%d*y%d',j,abs(A(i , j)));
    end
end

输出结果

     1     1     1     1
     2    -1     4    -3
     3    -4    -1     2
     4     3    -2    -1

x = x1^2+x2^2+x3^2+x4^2
y = y1^2+y2^2+y3^2+y4^2
x*y = z1^2+z2^2+z3^2+z4^2
z1 = x1*y1+x2*y1+x3*y1+x4*y1
z1 = x1*y2-x2*y1+x3*y4-x4*y3
z1 = x1*y3-x2*y4-x3*y1+x4*y2
z1 = x1*y4+x2*y3-x3*y2-x4*y1

对了,补充一下源程序的运行结果:

运行结果

n = 12345678
r 2422 348 2507 271

 希望各位有所收获。瑞斯拜。如果有不懂的欢迎留言评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于将一个数分解成四个数平方和的算法matlab 的相关文章

  • python批量检测域名和url能否打开

    python批量检测域名和url能否打开 python批量检测域名和url能否打开批量在浏览器中打开url或者域名总结 最近在挖src xff0c 然后有大量的域名 xff0c 而且大部分打不开 xff0c 所以就很浪费时间 xff0c 写
  • Failed to restart network.service: Unit network.service not found.

    解决 Failed to restart network service Unit network service not found 输入命令时遇到了问题 span class token function service span ne
  • nginx的启动,停止

    nginx的启动 xff0c 停止 启动启动代码格式 nginx的停止有三种方式 xff1a 从容停止快速停止强制停止 验证nginx配置文件是否正确方法一 xff1a 进入nginx安装目录sbin下 xff0c 输入命令 nginx t
  • 虚拟机连不上网解决办法,以及出现Ubuntu connect: Network is unreachable

    虚拟机连不上网解决办法 xff0c 以及出现Ubuntu connect Network is unreachable 问题来源具体过程 问题来源 出现了Ubuntu connect Network is unreachable这个问题 x
  • linux持久化

    linux持久化后门 添加超级用户SUID shellalias 后门inetdcrontab后门ssh公钥免密ssh软连接SSH wrapper后门PAM隐身登录隐藏文件Git hooksPROMPT COMMAND后门PROMPT CO
  • linux恶意进程隐藏

    https mp weixin qq com s 6Z4tErcnusYHTqiSUSVz3A https blog csdn net nzjdsds article details 82919100
  • 图图图图图

  • windows提权总结

    windows提权总结 内核溢出提权Windows系统配置错误提权系统服务权限配置错误注册表键AlwaysInstallElevated可信任服务路径漏洞自动安装配置文件计划任务 Windows组策略首选项提权 SYSVOL GPP SYS
  • 运行Intel realsense L515相机

    运行Intel realsense L515相机 首先去官 https www intelrealsense com sdk 2 xff0c 按照上面的提示安装各种文件 xff0c 然后输入realsense viewer出现可视化窗口 下
  • python的shellcode_loader解释

    python的shellcode loader解释 代码 loader传到主机执行 xff0c shellcode传到自己的服务器上 简单的python shellcode加载器 xff0c 直接上代码 xff0c 注释都在代码里 代码 s
  • 「网络工程师必会技能」-路由器介绍和路由器基本配置

    网络工程师必会技能 路由器介绍和路由器基本配置 xff0c 这是每个网络必须会的技能 xff0c 不是你有证书就一个网络工程师了哦 xff01 以Cisco路由器为例说明 xff1a xff08 1 xff09 访问路由器 访问路由器与访问
  • 英飞凌微控制器,驱动物联网的关键“大脑”

    英飞凌微控制器 xff0c 驱动物联网的关键 大脑 英飞凌各种各样的传感器以及基于它们的创新应用 xff0c 可谓是打开了传感器的 兵器库 xff0c 令人大开眼界 今天 xff0c 我们将进入 计算 这一环节 xff0c 看看唯样商城代理
  • EMC对策产品:TDK扩大了内置ESD保护功能的陷波滤波器阵容

    EMC对策产品 xff1a TDK扩大了内置ESD保护功能的陷波滤波器阵容 新的陷波滤波器同时实现了ESD保护和最大频率为5 3 GHz频段噪声抑制抑制无线通信中产生的TDMA噪声 xff0c 提高无线信号接收灵敏度强大的静电保护能力 xf
  • 这27个电源符号,别再分不清 快收藏起来学习

    这27个电源符号 xff0c 别再分不清 xff01 快收藏起来学习 以下的V代表Volatge的意思 电源符号 解析 VCC C可以理解为三极管的集电极Collector或者电路Circuit xff0c 指电源正极 VDD D可以理解为
  • 74ls160引脚图引脚图和功能真值表

    74ls160引脚图管脚图及功能真值表 xff0c 74ls160引脚图管脚图74LS160的功能真值表 综合电路图 74ls160引脚图管脚图 74LS160的功能真值表 唯样商城是本土元器件目录分销商 xff0c 采用 小批量 现货 样
  • 最全74HC04六反相器中文资料|引脚图及功能表|应用电路图

    最全74HC04六反相器中文资料 引脚图及功能表 应用电路图 最全74HC04六反相器中文资料 引脚图及功能表 应用电路图 xff0c 该74HC04 74HCT04是高速CMOS器件 xff0c 低功耗肖特基的TTL LSTTL 电路 功
  • 房卡一插就有电 酒店插卡取电原理解析

    房卡一插就有电 酒店插卡取电原理解析 酒店插卡取电的原理是什么 xff0c 入住酒店只需用房卡一插就有电 xff0c 原理是什么呢 xff1f 只是一张塑料片不能导电的啊 导读 xff1a 酒店插卡取电的原理是什么 xff0c 入住酒店只需
  • SiC MOSFET驱动电压的分析及探讨

    SiC设计干货分享 xff08 一 xff09 xff1a SiC MOSFET驱动电压的分析及探讨 随着制备技术的进步 xff0c 在需求的不断拉动下 xff0c 碳化硅 xff08 SiC xff09 器件与模块的成本逐年降低 相关产品
  • EM-500储能网关的AI采集性能实测

    EM 500储能网关的AI采集性能实测 EM 500是致远电子面向工商储能应用推出的高性价比储能网关产品 为满足采集外部传感器数据需要 xff0c EM 500设计内置了多通道高性能AI采集接口 xff0c 本文将对其进行一次实测 EM 5
  • 【IoT开发】UART通信高频测试

    测试所使用芯片 STM32F103RCT6 UART收发的极限频率 xff1a bytes s 1 发送频率 主程序循环发送一字节u8整型 xff0c 记录次数 while 1 t 43 43 if t 61 61 255 t 61 0 p

随机推荐

  • 560V输入、无光隔离反激式转换器

    560V输入 无光隔离反激式转换器 在传统的隔离式高压反激式转换器中 xff0c 使用光耦合器将稳压信息从副边基准电压源电路传输到初级侧 xff0c 从而实现严格的稳压 问题在于 xff0c 光耦合器大大增加了隔离设计的复杂性 xff1a
  • 用于DC-DC转换器的MIL-SPEC COTS EMC输入滤波器

    用于DC DC转换器的MIL SPEC COTS EMC输入滤波器 DC DC转换器的开关动作可能会引起不良的共模和差模噪声 xff0c 在频谱的许多点上创建不可接受的干扰 前端 xff08 或电力线 xff09 滤波器旨在在DC DC转换
  • C语言中调用nop();解决办法

    C语言中调用 nop 解决办法 可在头文件中添加 include lt intrins h gt 或是直接删去 nop intrins h一般用在keilC51单片机编程中 xff0c 一般程序中需要使用到空指令 nop 字符循环移位指令
  • rosrun teleop_twist_keyboard teleop_twist_keyboard.py

    rospack Error package teleop twist keyboard not found 解决方案 xff1a 1 cd catkin ws src xff08 如果没有这个目录先在工作目录下创建工作空间 xff1a mk
  • ubuntu20.04安装ros配置秘钥时出现gpg: keyserver receive failed: Connection timed out

    gpg keyserver receive failed Connection timed out也是从公钥服务器接收失败 xff1a 连接超时 解决方案1 换自己的手机热点 解决方案2 切换网络配置 xff1a 这大多数是网络的问题 xf
  • rosbag的命令使用以及代码编写

    概念 xff1a rosbag是用于录制和回放 ROS 主题的一个工具集 作用 实现了数据的复用 xff0c 方便调试 测试 本质 xff1a rosbag本质也是ros的节点 xff0c 当录制时 xff0c rosbag是一个订阅节点
  • 格式化串漏洞

    格式化字符串漏洞本身并不算缓冲区溢出漏洞 xff0c 这里作为比较典型的一类漏洞进行简单介绍 为了能够将字符串 变量 地址等数据按照指定格式输出 xff0c 通常使用包含格式化控制符的常量字符串作为格式化串 xff0c 然后指定用相应变量来
  • 单链表的遍历

    1 什么是遍历 遍历就是把单链表的各个节点挨个拿出来 xff0c 一个不能少 xff0c 也不能重复 xff0c 追求效率 2 如何遍历单链表 xff08 1 xff09 分析数据结构的本身特点 xff0c 然后根据根据它本身的特点制定相应
  • 单链表之删除节点

    1 删除节点的步骤 xff08 1 xff09 找到要删除的这个节点 xff1a 通过遍历来查找节点 xff0c 从头指针 43 头节点开始 xff0c 顺着链表依次将各个节点拿出来 xff0c 按照一定的方法比对 xff0c 找到我们要删
  • lssek函数的用法及作用

    1 lseek函数的介绍 xff08 1 xff09 文件指针 xff1a 当我们对一个文件读写时 xff0c 一定需要打开这个文件 xff0c 所以我们操作的都是动态文件 xff0c 动态文件在内存中的形态就是流的形式 xff08 2 x
  • ubuntu20.04安装arduino IDE(亲测可用)

    步骤一 xff1a 在官网下载arduino安装包选择相应的版本 下载链接 步骤二 xff1a 解压下载的安装包在相应的目录下执行下面语句 tar xvf 安装包名 步骤三 xff1a 将解压后的安装包移动到 opt目录下 sudo mv
  • px4无人机常识介绍(固件,px4等)

    专业名词解释 aircraft 任何可以飞或者可以携带物品还是搭载旅客的飞行器统称为飞机 航空器 uav 无人驾驶飞机 vehicle 飞行器 airplane plane aero plane 有机翼和一个或多个引擎的飞行器统称为飞机 D
  • 在运行ros的Python文件时报找不到路径

    1 第一行解释器声明 xff0c 可以使用绝对路径定位到 python3 的安装路径 usr bin python3 xff0c 但是不建议 2 建议使用 usr bin env python 但是会抛出异常 usr bin env pyt
  • ros文件架构

    WorkSpace span class token operator span span class token operator span 自定义的工作空间 span class token operator span span cla
  • 用C语言和汇编给寄存器赋值

    1 用汇编 要根据目标CPU的体系 xff0c 用对应的汇编类型编写 ldr r0 61 0X020C4068 CCGR0 ldr r1 61 0XFFFFFFFF str r1 r0 2 用C语言 要知道相关寄存器地址 官方会提供参考手册
  • 商人过河--广度优先搜索--matlab实现

    进行了代码优化 目录 应用背景 xff1a 模型求解 xff1a 模型建立 xff1a 模型实现 xff1a 源代码 xff1a 运行结果 xff1a 附 xff1a 应用背景 xff1a M个商人与N个仆从过河 xff0c 小船一次可载k
  • C++---全局对象、局部对象、静态对象

    1 全局对象 xff0c 程序一开始 xff0c 其构造函数就先被执行 xff08 比程序进入点更早 xff09 xff1b 程序即将结束前其析构函数将被执行 2 局部对象 xff0c 当对象生成时 xff0c 其构造函数被执行 xff1b
  • 2011年B题交通巡警第一问的练习与实现

    题目要求 xff1a 试就某市设置交巡警服务平台的相关情况 xff0c 建立数学模型分析研究下面的问题 xff1a xff08 1 xff09 附件1中的附图1给出了该市中心城区A的交通网络和现有的20个交巡警服务平台的设置情况示意图 xf
  • 利用最大流最小割算法matlab割图

    目录 练习思路 matlab绘图 噪音 坐标编码 邻接矩阵 最大流最小割算法 对最大流最小割算法求解结果转换为图像 源代码 运行实例 TIPS 最近学习了最大流和最小割算法 xff0c 可以把图看成是一些点的集合 xff0c 色彩差值的倒数
  • 关于将一个数分解成四个数平方和的算法matlab

    目录 理论基础 拉格朗日四平方数和定理 高斯恒等式 操作步骤 分解质因数 求解四平方数 应用高斯恒等式 小结 高斯恒等式输出代码 输出结果 运行结果 怎么把一个大数分解成四个小数的平方和呢 xff1f 理论基础 拉格朗日四平方数和定理 每个