相亲数

维基百科,自由的百科全书
跳转至: 导航搜索

相亲数(Amicable Pair),又称亲和数友愛數友好數,指兩個正整數中,彼此的全部约数之和(本身除外)与另一方相等。毕达哥拉斯曾說:“朋友是你灵魂的倩影,要像220与284一样亲密。”

例如220与284:

  • 220的全部约数(除掉本身)相加是:1+2+4+5+10+11+20+22+44+55+110=284
  • 284的全部约数(除掉本身)相加的和是:1+2+4+71+142=220

換句話說,親和數又可以說成是兩個正整數中,一方的全部約數之和與另一方的全部約數之和相等。

  • 220的全部約數之和是:1+2+4+5+10+11+20+22+44+55+110+220 = 284+220 = 504
  • 284的全部約數之和是:1+2+4+71+142+284 = 220+284 = 504

历史[编辑]

  • 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,nm<na=2^m (2^{n-m} + 1) -1b=2^n (2^{n-m}+1) -1c=2^{n+m} (2^{n-m} +1)^2 -1。若a,b,c均為質數,則2^n \times ab 2^n \times c是相親數。這個法則能找出符合親和數的數對(m,n)=(1,2),(3,4),(6,7),(1,8),(29,40),但n<2500時沒有其他符合的數對。

塔別脫·本·科拉法則[编辑]

這是歐拉法則m=n-1的特殊情況:第n個塔別脫·本·科拉數K_n = 3 \times 2^n - 1。若K_nK_{n-1}3 \times K_{2n-1} + 2均為質數,則2^n K_n K_{n-1}2^n \times 3 \times K_{2n-1} + 2是相親數。

一段列出亲和数和完全数的Java程序[编辑]

import java.util.ArrayList;
import java.util.List;
 
public class love_num 
{
    public static void main(String[] args) 
    {
        int intMain = 2;
        int intBig = 0;
        try
        {
            intBig = Integer.parseInt(args[0]);
        }
        catch(Exception e)
        {
            System.out.println("error:" + e);
            System.out.println("type command like \"java love_num 50\"");
            return;
        }
        do
        {
            List<Integer> listYakuSu1 = findYakuSu(intMain);
            int intSum1 = addYakuSu(listYakuSu1);
            if(intSum1 == intMain)
            {
                System.out.println("self num:" + intSum1);
            }
            else
            {
                List<Integer> listYakuSu2 = findYakuSu(intSum1);
                int intSum2 = addYakuSu(listYakuSu2);
                if(intSum2 == intMain)
                {
                    System.out.println("love num:" + intMain + "--" + intSum1);
                }
            }
            intMain ++;
        } while(intMain <= intBig);
    }
    public static int addYakuSu(List<Integer> listYakuSu)
    {
        int sum = 0;
        for(int i : listYakuSu)
        {
            sum += i;
        }
        return sum;
    }
    public static List<Integer> findYakuSu(int intNum)
    {
        List<Integer> listYakuSu = new ArrayList<Integer>();
        listYakuSu.add (1);
        int intRoot = (int)Math.sqrt(intNum);
        for(int i = 2; i <= intRoot ; i++)
        {
            int intPart = intNum/i;
            if(intPart * i == intNum)
            {
                listYakuSu.add (i);
                if(intPart != i)
                {
                    listYakuSu.add (intPart);
                }
            }
        }
        return listYakuSu;
    }
}

参看[编辑]