相亲数
维基百科,自由的百科全书
——毕达哥拉斯
相亲数(Amicable Pair),又称亲和数、友愛數,指兩個正整數中,彼此的全部约数之和(本身除外)与另一方相等。
例如220与284:
- 220的全部约数(除掉本身)相加是:1+2+4+5+10+11+20+22+44+55+110=284
- 284的全部约数(除掉284本身)相加的和是:1+2+4+71+142=220
目录 |
[编辑] 举例
- 220、284
- 1184、1210
- 2620、2924
- 5020、5564
- 6232、6368
- 10744、10856
- 12285、14595
- 17296、18416
- 63020、76084
- 66928、66992
- 67095、71145
- 69615、87633
- 79750、88730
- ……
[编辑] 历史
- 320年左右,古希腊毕达哥拉斯发现的220与284,是人类认识的第一对相亲数.
- 约850年,阿拉伯数学家塔別脫·本·科拉就發現了相亲数公式,後來稱為塔別脫·本·科拉法則。
- 1636年,費馬发现了另一对相亲数:17296和18416。
- 1638年,笛卡儿也发现了一对相亲数:9363584和9437056。
- 欧拉也研究过相亲数这个课题。1750年,他一口气向公众抛出了60对相亲数:2620和2924,5020和5564,6232和 6368,……,从而引起了轰动。
- 1866年,年方16岁的意大利青年巴格尼发现1184与1210是仅仅比220与284稍为大一些的第二对相亲数。
- 目前,人们已找到了1200多对相亲数。但相亲数是否有无穷多对,相亲数的两个数是否都是或同是奇数,或同是偶数,而没有一奇一偶等,这些问题还有待继续探索。
[编辑] 尋找方法
[编辑] 歐拉法則
對於正整數m,n,m < n,a = 2m(2n − m + 1) − 1,b = 2n(2n − m − 1) − 1,c = 2n + m(2n − m + 1)2 − 1。若a,b,c均為質數,則和 是相親數。這個法則能找出符合親和數的數對(m,n) = (1,2),(3,4),(6,7),(1,8),(29,40),但n < 2500時沒有其他符合的數對。
[编辑] 塔別脫·本·科拉法則
這是歐拉法則m = n − 1的特殊情況:第n個塔別脫·本·科拉數。若Kn、Kn − 1和均為質數,則2nKnKn − 1 和 是相親數。
[编辑] 一段列出亲和数和完全数的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); }
}