友愛数

| コメント(3) | トラックバック(0)

友愛数とは、一方の数の約数の和が、他方の数に等しいという相互関係がある数のペアのことである。nの約数の和を表す関数を、オイラーに従い、σ(n)と置く。σ(n)には、n自身も含まれる。

すると、nとmが友愛数であるとは、
σ(n) - n = m且つσ(m) - m = nであることである。これを変形すると、
σ(n) = n + mで、σ(m) = n + mなので、σ(n) = σ(m)

すると、コンピュータなどで計算させるには、σ(n) = n + m且つσ(n) = σ(m)となるn,mを求めることになる。

下記のCのサンプルプログラムでは、σ(n)を、int sigma(int n)という関数として定義した。なお、このプログラムでは、if ( j > 3*i ) continue; という条件文をおいて、ループを少しでもスキップすることにより高速化を図った。友愛数は、決して一方が他方の2倍以上ではないという観察による。ただ、心配なので、3倍にしてみた。

このプログラムで直ぐにみつかる友愛数は、下記のとおりである。
(220,284)
(1184,1210)
(2620,2924)
(5020,5564)
(6232,6368)
(10744,10856)

そこで、問題は次のとおりである。
(1) 友愛数は、無限に存在するか。これはそうだろうと予想されているが、証明はされてない。しかし、双子素数と比較しても、見かけは極端に少ない。なにしろ、10000以内に、5組しかない。無限性の証明は、双子素数と比較しても、簡単そうではない。
(2) 上記の友愛数の例は、(偶数,偶数)であった。オイラーは、(奇数,奇数)の友愛数の例も見つけた。では、偶数と奇数の組み合せの友愛数は存在するだろうか。これは存在しないと予想されているが、証明はされてない。


#include <stdio.h>

int sigma(int n);

int main()   {

int i,j;
int k;

for ( i = 2; i < 100000; i++ )   {
  for ( j = 2; j < 100000; j++ )   {
  if ( j > 3*i ) continue;
    if ( i < j )      {
      if (( k = sigma(i)) == i+j && sigma(j) == k  )  {
    printf("(%d,%d)\n",i,j);
   }
    }
  }
}

 return 0;
}

int sigma(int n)  {
 
 int i = 1;
 int s = 0;
 
 while ( i <= n/2 )     {
  if (( n % i ) == 0 )   {
 s += i;
  }
  i++;
 }
 s += n;
 
 return s;

}

 

トラックバック(0)

トラックバックURL: http://commutative.world.coocan.jp/mt/mt-tb.cgi/1423

コメント(3)

友愛数の発展で社交数なるものがあるそうです。
>異なる3つ以上の自然数の組で、ある数(A)の自分自身を除いた約数の和がほかの数(B)になり、(B)の自分自身を除いた約数の和が(C)になる。これを続けていくと、元の数(A)になるような数の組を言う。
うーん、なるほど。

>友愛数
「友愛」数とか言われると、どっかの党首があたまに浮かび、「8,10,8ま」を連想しました。(全くつまりませんね、済みません・・・)



>「友愛」数とか言われると、どっかの党首があたまに浮かび、

いえ、おっしゃるとおり、友愛数というのは、数学らしくなくて、いいネーミングとは思いません。互助数とか、相和数とか他の言い方もあるかも、あれっ、余計分からなくなってきました。

コメントする

このブログ記事について

このページは、あやたろうが2009年8月20日 08:42に書いたブログ記事です。

ひとつ前のブログ記事は「水素エネルギー」です。

次のブログ記事は「ペリリュー島」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。