拉马努金,是一个在数字上极具天赋的印度数学家。在和朋友的对话中,朋友谈到一个出租车的车牌号是毫无趣味的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.(在矩阵中搜索,不用无脑循环)相关推荐

  1. 寻找拉马努金数(Python实现)

    起源:Srinivasa Ramanujan是一个因他在数字上的天分而出名的印度数学家.有一天,英国数学家G.H.Hardy来拜访他,Hardy提到自己乘坐的出租车标有一个相当无聊的数字1729.Ra ...

  2. MATLAB——验证拉马努金连根式

    MATLAB-验证拉马努金连根式 题目描述 原理分析 拉马努金恒等式,简单地说,就是反复利用平方差公式把一个数展开成一个开方式 数学证明 算法分析 ①既然是反复展开成一个式子,考虑利用循环即设计循环方 ...

  3. 拉马努金:“与神对话”的数学天才

    不管你 一个无法表达神的思想的方程, 对我而言毫无意义 -- 斯里尼瓦瑟·拉马努金 本文摘自人民邮电出版社图灵文化出版的图书<悠扬的素数:二百年数学绝唱黎曼假设> 当哈代和利特尔伍德步履维 ...

  4. 权重随机抽奖, 拉马努金数

    一 权重随机抽奖 我的理解是 5权重概率是4权重概率的2倍,是3权重概率的4倍,那这不就是2的阶乘嘛 思路:循环权重,生成对应的随机比例,然后将这个比例值添加到总随机数上进行随机 import ran ...

  5. 拉马努金,天才之超越

    作者:梁志凡 2013-02-01 13:11:02来源:南方周末 标签 拉马努金 印度之子 数学天才 这位泰戈尔的同胞来自印度南端的泰米尔纳德邦,从未接受过正规数学训练的他具有惊人的数学直觉,独立发 ...

  6. 从拉马努金到张益唐——数学是一个整体

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 分享到: ...

  7. 传奇数学家拉马努金留下的数学神谕,解开了多年悬而未决的神秘难题

    ◆ ◆ ◆ 序 印度数学奇才斯里尼瓦瑟· 拉马努金在短短的一生中写下了大量论文,虽然多数文章在生前未得以发表,但借助其中一些文章中的全新见解,数学家肯恩· 小野解开了长久以来悬而未决的神秘数学难题. ...

  8. 使用Python通过拉马努金公式快速求π

    使用Python通过拉马努金公式快速求π 一.前言 π是一个数学常数,定义为:圆的周长与直径的比值. π是一个无理数,也是一个超越数,它的小数部分无限不循环. π可以用来精确计算圆周长.圆面积.球体积 ...

  9. 拉马努金的整数拆分全排列JAVA实现非递归

    拉马努金的整数拆分全排列JAVA实现非递归 点这里: 递归方式 结果是:组合成100的可能性共有:190569292种!! 不做详细说明了,需要看文字描述的,点上面链接跳转递归方式,查看详细说明 来, ...

最新文章

  1. Java基础——常用Map的实现细节
  2. linux通信中recv,linux套接字通信之recv中的缓存机制的研究
  3. LogisticRegression针对中文文本分类
  4. quratz启动流程
  5. Vue学习笔记(四)—— 前端路由
  6. php for循环可以变量关联数组,数组与字符串,变量之间的转换+数组元素的回调处理+用for()循环来遍历关联数组...
  7. linux锐捷代码_锐捷认证 For Linux
  8. 数据结构1800题-错题集-第三章
  9. 案例 | 上海移动:数字化通向互联网的三个路标
  10. linux(rhel) rescue修复详解
  11. 探索 Word 2007 开发(二):扩展 Ribbon
  12. 12306火车票抢票助手使用详解
  13. 怎样才能叫高级程序员?
  14. [洛谷P2184]贪婪大陆
  15. 苹果apple账号授权登录第三方APP
  16. 华为云桌面客户端_华为云服务器购买及环境搭建简述
  17. 酒店、宾馆、饭店的区别
  18. qpython 3h和oh_**python中的类和他的成员
  19. JSP使用Struts1提交中文表单时乱码,字符编码问题
  20. 音乐社会计算机英语,计算机音乐技术应用,Computer music technology application,音标,读音,翻译,英文例句,英语词典...

热门文章

  1. 矩阵论——空间投影及其应用
  2. python-温度从华氏温度转换为摄氏温度
  3. 奔驰网络语言c class,重新定义豪华,全新一代奔驰C-Class正式官宣亮相
  4. 【veriog】正向计时器设计(FPGA,秒表,时钟,正向计时)
  5. ubantu的一些配置、安装软件等问题汇集此篇
  6. 李阳疯狂英语900句(675-900)
  7. 多线程内使用GetDC的注意问题
  8. JQuery圆形进度条
  9. 国家生物信息中心开发DNA甲基化芯片数据标准化方法—GMQN
  10. R语言基于ggplot绘制多条ROC曲线(2)