标题：亲和数
术语简介
亲和数是一种古老的数。
遥远的古代，人们发现某些自然数之间有特殊的关系：如果两个数a和b，a的所有除本身以外的因数之和等于b,b的所有除本身以外的因数之和等于a,则称a,b是一对亲和数。
历史发展
据说，毕达哥拉斯(Pythagoras, 希腊文Πυθαγόρας，约前580年—前500年)的一个门徒向他提出这样一个问题：“我结交朋友时，存在着数的作用吗？”毕达哥拉斯毫不犹豫地回答：“朋友是你的灵魂的倩影，要象220和284一样亲密。”又说“什么叫朋友？就象这两个数，一个是你，另一个是我。”后来，毕氏学派宣传说：人之间讲友谊，数之间也有“相亲相爱”。从此，把220和284叫做“亲和数”或者叫“朋友数”或叫“相亲数”。这就是关于“亲和数”这个名称来源的传说。220和284是人类最早发现，又是最小的一对亲和数。
毕达哥拉斯首先发现220与284就是一对亲和数，在以后的1500年间，世界上有很多数学家致力于探寻亲和数，面对茫茫数海，无疑是大海捞针，虽经一代又一代人的穷思苦想，有些人甚至为此耗尽毕生心血，却始终没有收获。公元九世纪，伊拉克哲学、医学、天文学和物理学家泰比特·依本库拉曾提出过一个求亲和数的法则，因为他的公式比较繁杂，难以实际操作，再加上难以辨别真假，故它并没有给人们带来惊喜，或者走出困境。数学家们仍然没有找到第二对亲和数。直到费尔马(P．de Fermat，1601-1665)才发现了另一对亲和数：17296和18416。
十六世纪，已经有人认为自然数里就仅有这一对亲和数。有一些无聊之士，甚至给亲和数抹上迷信色彩或者增添神秘感，编出了许许多多神话故事。还宣传这对亲和数在魔术、法术、占星术和占卦上都有重要作用等等。
费尔马距离第一对亲和数诞生2500多年以后，历史的车轮转到十七世纪，1636年，法国“业余数学家之王”费尔马找到第二对亲和数17296和18416，重新点燃寻找亲和数的火炬，在黑暗中找到光明。两年之后，“解析几何之父”——法国数学家笛卡尔(René Descartes)于1638年3月31日也宣布找到了第三对亲和数9437056和9363584。费马和笛卡尔在两年的时间里，打破了二千多年的沉寂，激起了数学界重新寻找亲和数的波涛。
在十七世纪以后的岁月，许多数学家投身到寻找新的亲和数的行列，他们企图用灵感与枯燥的计算发现新大陆。可是，无情的事实使他们省悟到，已经陷入了一座数学迷宫，不可能出现法国人的辉煌了。
正当数学家们真的感到绝望的时候，平地又起了一声惊雷。1747年，年仅39岁的瑞士数学家欧拉竟向全世界宣布：他找到了30对亲和数，后来又扩展到60对，不仅列出了亲和数的数表，而且还公布了全部运算过程。
欧拉欧拉采用了新的方法，将亲和数划分为五种类型加以讨论。欧拉超人的数学思维，解开了令人止步2500多年的难题，使数学家拍案叫绝。
时间又过了120年，到了1867年，意大利有一个爱动脑筋，勤于计算的16岁中学生白格黑尼，竟然发现数学大师欧拉的疏漏——让眼皮下的一对较小的亲和数1184和1210溜掉了。这戏剧性的发现使数学家如痴如醉。
麦达其和叶维勒汇在以后的半个世纪的时间里，人们在前人的基础上，不断更新方法，陆陆续续又找到了许多对亲和数。到了1923年，数学家麦达其和叶维勒汇总前人研究成果与自己的研究所得，发表了1095对亲和数，其中最大的数有25位。同年，另一个荷兰数学家里勒找到了一对有152位数的亲和数。
在找到的这些亲和数中，人们发现，亲和数发现的个数越来越少，数位越来越大。同时，数学家还发现，若一对亲和数的数值越大，则这两个数之比越接近于1，这是亲和数所具有的规律吗？人们企盼着最终的结论。
电子计算机诞生以后，结束了笔算寻找亲和数的历史。有人在计算机上对所有100万以下的数逐一进行了检验，总共找到了42对亲和数，发现10万以下数中仅有13对亲和数。但因计算机功能与数学方法的不够，目前还没有重大突破，但是，寻找亲和数未来正等待着不畏艰辛的数学家和计算机专家，同时，发现新的亲和数的捷报也正等待着不畏艰辛的数学家和计算机专家。
奇亲和数
人们还发现每一对奇亲和数中都有3，5，7作为素因数。1968年波尔.布拉得利(P.Bratley)和约翰.迈凯(J.Mckay)提出：所有奇亲和数都是能够被3整除的。1988年巴蒂亚托(S.Battiato)和博霍(W.Borho)利用电子计算机找到了不能被3整除的奇亲和数，从而推翻了布拉得利的猜想。他找到了15对都不能被3整除的奇亲和数，最小的一对是：a=s*140453*85857199和　b=s*56099*214955207其中s=5^4*7^3*11^3*13^2*17^2*19*61^2*97*107.将各个因数乘起来　a=353804384422460183965044607821130625和b=353808169683169683168273495496273894069375.
它们都是36位大数。作为一个未解决的问题，巴蒂亚托等希望有人能找到最小的。另一个问题是是否存在一对奇亲和数中有一个数不能被3整除。
还有一个欧拉提出的问题，是否存在一对亲和数，其中有一个奇数，另一个是偶数？因为现在发现的所有奇偶亲和数要么都是偶数，要么都是奇数。200多年来尚未解决。
亲和数的研究
主要有两方面：
(1)寻找新的亲和数。
(2)寻找亲和数的表达公式。
关于后一项工作，早在9世纪，阿拉伯的学者泰比特(TabitibnQorra)就提出了一个构造亲和数的公式： 
设 a=3*2^(x-1)-1, b=3*2^x-1,c=9*2^(2x-1)-1，这里x是大于1的自然数，如果a、b、c全是素数的话。那么2^x*ab与2^x*c。便是一对相亲和数。
例如，取x=2,得a=5,b=11,c=71,则2^2*5*11=220和2^2*71=284是一对亲和数。
亲和数举例
例如220和284，1184和1210，2620和2924，5020和5564，6232和6368。
亲和数列举： 
ans =
220 284
ans =
1184 1210
ans =
2620 2924
ans =
5020 5564
ans =
6232 6368
ans =
10744 10856
ans =
12285 14595
ans =
17296 18416
ans =
63020 76084
ans =
66928 66992
ans =
67095 71145
ans =
69615 87633
ans =
79750 88730
ans =
100485 124155
ans =
122265 139815
ans =
122368 123152
ans =
141664 153176
ans =
142310 168730
ans =
171856 176336
ans =
176272 180848
ans =
185368 203432
ans =
196724 202444
ans =
280540 365084
ans =
308620 389924
ans =
319550 430402
ans =
437456 455344
ans =
469028 486178
ans =
503056 514736
ans =
522405 525915
ans =
600392 669688
ans =
609928 686072
ans =
624184 691256
ans =
635624 712216
ans =
643336 652664
ans =
667964 783556
ans =
726104 796696
ans =
802725 863835
ans =
879712 901424
ans =
898216 980984
ans =
947835 1125765
ans =
998104 1043096
ans =
1077890 1099390
ans =
1154450 1189150
ans =
1156870 1292570
ans =
1175265 1438983
ans =
1185376 1286744
ans =
1280565 1340235
ans =
1328470 1483850
ans =
1358595 1486845
ans =
1392368 1464592
ans =
1466150 1747930
ans =
1468324 1749212
ans =
1511930 1598470
ans =
1669910 2062570
ans =
1798875 1870245
ans =
2082464 2090656
ans =
2236570 2429030
ans =
2652728 2941672
ans =
2723792 2874064
ans =
2728726 3077354
ans =
2739704 2928136
ans =
2802416 2947216
ans =
2803580 3716164
ans =
3276856 3721544
ans =
3606850 3892670
ans =
3786904 4300136
ans =
3805264 4006736
ans =
4238984 4314616
ans =
4246130 4488910
ans =
4259750 4445050
ans =
4482765 5120595
ans =
4532710 6135962
ans =
4604776 5162744
ans =
5123090 5504110
ans =
5147032 5843048
ans =
5232010 5799542
ans =
5357625 5684679
ans =
5385310 5812130
ans =
5459176 5495264
ans =
5726072 6369928
ans =
5730615 6088905
ans =
5864660 7489324
ans =
6329416 6371384
ans =
6377175 6680025
ans =
6955216 7418864
ans =
6993610 7158710
ans =
7275532 7471508
ans =
7288930 8221598
ans =
7489112 7674088
ans =
7577350 8493050
ans =
7677248 7684672
ans =
7800544 7916696
ans =
7850512 8052488
ans =
8262136 8369864
ans =
8619765 9627915
ans =
8666860 10638356
ans =
8754130 10893230
ans =
8826070 10043690
ans =
9071685 9498555
ans =
9199496 9592504
ans =
9206925 10791795
ans =
9339704 9892936
ans =
9363584 9437056
ans =
9478910 11049730
ans =
9491625 10950615
ans =
9660950 10025290
ans =
9773505 11791935
ans =
10254970 10273670
ans =
10533296 10949704
ans =
10572550 10854650
ans =
10596368 11199112
ans =
10634085 14084763
ans =
10992735 12070305
ans =
11173460 13212076
ans =
11252648 12101272
ans =
11498355 12024045
ans =
11545616 12247504
ans =
11693290 12361622
ans =
11905504 13337336
ans =
12397552 13136528
ans =
12707704 14236136
最长链： 
14316 - 19116 - 31704 - 47616 - 83328 - 177792 - 295488 - 629072 - 589786 - 294896 - 358336 - 418904 - 366556 - 274924 - 275444 - 243760 - 376736 - 318028 - 285778 - 152990 - 122410 - 97946 - 48976 - 45946 - 22976 - 22744 - 19916 - 17716 - 14316
相关程序
附：用计算机编出的计算亲和数的JAVA程序
import java.util.ArrayList; import java.lang.Math; import java.lang.Double;
public class love_num {
public static void main(String[] args) 
{
int intMain = 2;
int intBig = 0;
try
{
intBig = Integer.parseInt(args[0].toString());
}
catch (Exception e)
{
System.out.println("error:" + e);
System.out.println("type command like \"java love_num 50\"");
return;
}
while (true)
{
ArrayList listYakuSu1 = findYakuSu(intMain);
int intSum1 = addYakuSu(listYakuSu1);
//String strDebug = "";
//String strDebug2 = "";
if ( intSum1 == intMain )
{
System.out.println("self num:" + intSum1);
//for (int i = 0; i < listYakuSu1.size(); i ++)
//{
// strDebug += listYakuSu1.get(i);
// strDebug += ",";
//}
//System.out.println("YakuSu:" + strDebug);
}
else
{
ArrayList listYakuSu2 = findYakuSu(intSum1);
int intSum2 = addYakuSu(listYakuSu2);
if ( intSum2 == intMain )
{
System.out.println("love num:" + intMain + "--" + intSum1);
//for (int i = 0; i < listYakuSu1.size(); i ++)
//{
// strDebug += listYakuSu1.get(i);
// strDebug += ",";
//}
//System.out.println("YakuSu:" + strDebug);
//for (int i = 0; i < listYakuSu2.size(); i ++)
//{
// strDebug2 += listYakuSu2.get(i);
// strDebug2 += ",";
//}
//System.out.println("YakuSu:" + strDebug2);
}
}
intMain ++;
if (intMain > intBig)
{
return;
}
}
}
public static int addYakuSu (ArrayList listYakuSu)
{
//System.out.println("addYakuSu start ");
int sum = 0;
int temp = 0;
for (int i = 0; i < listYakuSu.size() ; i ++ )
{
temp = Integer.parseInt(listYakuSu.get(i).toString());
sum += temp;
}
//System.out.println("addYakuSu end " + sum); 
//System.out.println("");
return (sum);
}
public static ArrayList findYakuSu (int intNum)
{
//String strDebug = "";
//System.out.println("findYakuSu start " + intNum);
ArrayList listYakuSu = new ArrayList();
double dbNum = (double)intNum;
double dbRoot = Math.sqrt(dbNum);
Double d = new Double(dbRoot);
int intRoot = d.intValue() ;
//System.out.println("root:" + intRoot);
// if (intHalf * 2 == intNum)
// {
// }
// else
// {
// intHalf ++;
// }
listYakuSu.add ("1");
for (int i = 2; i <= intRoot ; i ++)
{
int intPart = intNum/i;
if (intPart * i == intNum)
{
if (intPart == i)
{
listYakuSu.add (Integer.toString(i));
//strDebug += Integer.toString(i);
//strDebug += ",";
}
else
{
listYakuSu.add (Integer.toString(i));
listYakuSu.add (Integer.toString(intPart));
//strDebug += Integer.toString(i);
//strDebug += ",";
//strDebug += Integer.toString(intPart);
//strDebug += ",";
}
}
}
//System.out.println("findYakuSu end:1," + strDebug);
//System.out.println("");
return (listYakuSu);
}
}
用计算机编出的计算亲和数的MATLAB程序
for a=2:1:100000000
t=1;
n=2;
s=sqrt(a);
s=fix(s);
if a==s^2
t=t+s;
end
while n<s
m=mod(a,n);
if m==0
t=t+n+a/n;
end
n=n+1;
end
if t>a
b=t;
l=1;
d=2;
p=sqrt(b);
p=fix(p);
if b==p^2
l=l+p;
end
while d<p
m=mod(b,d);
if m==0
l=l+d+b/d;
end
d=d+1;
end
if l==a
[a,b] 
end
end
end