MATLAB寻找拉马努金数(出租车数):T=a3+b3=c3+d3.(在矩阵中搜索,不用无脑循环)
拉马努金,是一个在数字上极具天赋的印度数学家。在和朋友的对话中,朋友谈到一个出租车的车牌号是毫无趣味的1729,他立刻反映到说1729可以表示为两组不同的数,并且每组都是两个数的立方和。
出租车数的定义就是:可以用n种不同方式表示为两个立方体之和的最小数。目前已知的出租车数有六个:
T(1) = 2 = 1^3 + 1^3;
T(2) = 1729 = 1^3 + 12^3 = 9^3 + 10^3;
T(3) = 87539319 = 167^3 + 436^3 = 228^3 + 423^3 = 255^3 + 414^3;
T(4) = 6963472309248 = 2421^3 + 19083^3 = 5436^3 + 18948^3 = 10200^3 + 18072^3 = 13322^3 + 16630^3;
T(5) = 48988659276962496 = 38787^3 + 365757^3 = 107839^3 + 362753^3 = 205292^3 + 342952^3 = 221424^3 + 336588^3 = 231518^3 + 331954^3;
T(6) = 24153319581254312065344 = 582162^3 + 28906206^3 = 3064173^3 + 28894803^3 = 85192813^3 + 28657487^3 = 16218068^3 + 27093208^3 = 17492496^3 + 26590452^3 = 18289922^3 + 26224366^3;
如果用程序实现寻找出租车数,首先想到的可能就是用for循环迭代试错,但由上面可见用编程手段寻找出租车数,需要的计算量很大,无脑迭代的运行时间会非常长。MATLAB作为矩阵工作室,内置丰富的函数,现使用一种新的方法,把可能的情况生成到矩阵中,在矩阵中缩小范围,找到满足条件的拉马努金数。
首先我们先编写一个函数寻找满足T(2)的出租车数。编写一个函数TaxicabNum,使[a,b,c,d,M] = TaxicabNum(N)返回满足大于N的最小的出租车数M = a3 + b3 = c3 + d3,即输出M(大于或等于N),以及a,b,c和d的四个值。
主要的思路是:先把可能的情况存成矩阵,再使用matlab函数在矩阵中搜索。
代码如下:
function [a,b,c,d,M] = TaxicabNum(N)
%输入正整数N,找到当M>=N时最小的M,以及a,b,c,d,使a3+b3=c3+d3=M。limit = ceil(N^(1/3));
for max_no = limit:inf m = zeros(1,max_no); n = zeros(1,max_no);for i = 1:max_nom(1,i) = i; endfor j = 1:max_non(1,j) = j;endV1 = m.^3; V2 = n.^3;for x = 1:length(V1)for y = 1:length(V2)Space(x,y) = V1(x)+V2(y); endend[row,col] = find(Space>=N); for h = 1:length(row)after_retrieving(h) = Space(row(h),col(h));endtbl = tabulate(after_retrieving); Index = find(tbl(:,2)==4); if Index~=0 [R,C] = find(Space==Index(1)); a=R(1);b=C(1); c=R(2);d=C(2);M = a^3+b^3;return end
end
当输入为36301,在命令行调用[a,b,c,d,M]=TaxicabNum(36031)
运行结果为:a = 34; b = 2; c = 33; d = 15; M = 39312;
代码主要部分都是比较容易看得懂的,其中主要使用的函数是find函数和tabulate函数,感兴趣的可以搜一下这两个函数的用法,尤其是find函数在检索矩阵方面还是比较方便的。其中tabuate函数的返回值是三组列向量,第一列是其括号内矩阵中出现次数大于一的数,第二列是其对应出现的次数,第三列是该数出现的次数所占矩阵内元素总个数的比例。由于所有情况组成的矩阵为一对称矩阵,故满足出租车数的元素应在矩阵中出现了2n次。
根据这个思路,稍微更改一下程序,找到满足T(3)的出租车数。为减少计算量,我将搜索范围限定到87000000到88000000,此处也可手动设置。
代码如下:
clc;
clear all;T = [87000000,88000000];
limit = ceil(T(2)^(1/3)); m = zeros(1,limit);
n = zeros(1,limit);for i = 1:limitm(1,i) = i;
end
for j = 1:limitn(1,j) = j;
endV1 = m.^3;
V2 = n.^3;for x = 1:length(V1)for y = 1:length(V2)Space(x,y) = V1(x)+V2(y); end
end[row,col] = find(Space>=T(1) & Space<=T(2));for h = 1:length(row)after_retrieving(h) = Space(row(h),col(h));
endtbl = tabulate(after_retrieving);
Index = find(tbl(:,2)==6); [R,C] = find(Space == Index(1)); a = R(1);b = C(1);
c = R(2);d = C(2);
e = R(3);f = C(3);M = a^3+b^3; sprintf('%d %d %d %d %d %d %d',a, b, c, d, e,f, M)%显示a, b, c, d, e,f, M
运行结果为:436 167 423 228 414 255 87539319
经过调试验证,在寻找满足T(3)的出租车数时,运行时间为10秒,而使用for循环的运行时间超过了四十分钟,用这种算法寻找拉马努金数发挥了MATLAB矩阵运算的优势,相比使用for循环加条件试错,大大的缩短了运行的时间。
MATLAB寻找拉马努金数(出租车数):T=a3+b3=c3+d3.(在矩阵中搜索,不用无脑循环)相关推荐
- 寻找拉马努金数(Python实现)
起源:Srinivasa Ramanujan是一个因他在数字上的天分而出名的印度数学家.有一天,英国数学家G.H.Hardy来拜访他,Hardy提到自己乘坐的出租车标有一个相当无聊的数字1729.Ra ...
- MATLAB——验证拉马努金连根式
MATLAB-验证拉马努金连根式 题目描述 原理分析 拉马努金恒等式,简单地说,就是反复利用平方差公式把一个数展开成一个开方式 数学证明 算法分析 ①既然是反复展开成一个式子,考虑利用循环即设计循环方 ...
- 拉马努金:“与神对话”的数学天才
不管你 一个无法表达神的思想的方程, 对我而言毫无意义 -- 斯里尼瓦瑟·拉马努金 本文摘自人民邮电出版社图灵文化出版的图书<悠扬的素数:二百年数学绝唱黎曼假设> 当哈代和利特尔伍德步履维 ...
- 权重随机抽奖, 拉马努金数
一 权重随机抽奖 我的理解是 5权重概率是4权重概率的2倍,是3权重概率的4倍,那这不就是2的阶乘嘛 思路:循环权重,生成对应的随机比例,然后将这个比例值添加到总随机数上进行随机 import ran ...
- 拉马努金,天才之超越
作者:梁志凡 2013-02-01 13:11:02来源:南方周末 标签 拉马努金 印度之子 数学天才 这位泰戈尔的同胞来自印度南端的泰米尔纳德邦,从未接受过正规数学训练的他具有惊人的数学直觉,独立发 ...
- 从拉马努金到张益唐——数学是一个整体
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 分享到: ...
- 传奇数学家拉马努金留下的数学神谕,解开了多年悬而未决的神秘难题
◆ ◆ ◆ 序 印度数学奇才斯里尼瓦瑟· 拉马努金在短短的一生中写下了大量论文,虽然多数文章在生前未得以发表,但借助其中一些文章中的全新见解,数学家肯恩· 小野解开了长久以来悬而未决的神秘数学难题. ...
- 使用Python通过拉马努金公式快速求π
使用Python通过拉马努金公式快速求π 一.前言 π是一个数学常数,定义为:圆的周长与直径的比值. π是一个无理数,也是一个超越数,它的小数部分无限不循环. π可以用来精确计算圆周长.圆面积.球体积 ...
- 拉马努金的整数拆分全排列JAVA实现非递归
拉马努金的整数拆分全排列JAVA实现非递归 点这里: 递归方式 结果是:组合成100的可能性共有:190569292种!! 不做详细说明了,需要看文字描述的,点上面链接跳转递归方式,查看详细说明 来, ...
最新文章
- Java基础——常用Map的实现细节
- linux通信中recv,linux套接字通信之recv中的缓存机制的研究
- LogisticRegression针对中文文本分类
- quratz启动流程
- Vue学习笔记(四)—— 前端路由
- php for循环可以变量关联数组,数组与字符串,变量之间的转换+数组元素的回调处理+用for()循环来遍历关联数组...
- linux锐捷代码_锐捷认证 For Linux
- 数据结构1800题-错题集-第三章
- 案例 | 上海移动:数字化通向互联网的三个路标
- linux(rhel) rescue修复详解
- 探索 Word 2007 开发(二):扩展 Ribbon
- 12306火车票抢票助手使用详解
- 怎样才能叫高级程序员?
- [洛谷P2184]贪婪大陆
- 苹果apple账号授权登录第三方APP
- 华为云桌面客户端_华为云服务器购买及环境搭建简述
- 酒店、宾馆、饭店的区别
- qpython 3h和oh_**python中的类和他的成员
- JSP使用Struts1提交中文表单时乱码,字符编码问题
- 音乐社会计算机英语,计算机音乐技术应用,Computer music technology application,音标,读音,翻译,英文例句,英语词典...