C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++】アリコット数列の求め方と実装例をわかりやすく解説

アリコット数列とは

アリコット数列(Aliquot Sequence)は、特殊な性質をもった数列です。数列はある整数から始まり、次の項は直前の項の真の約数(その数自身を除く約数)の総和として定義されます。

具体的な例で確認してみましょう。

入力 : 8
出力 : 8 7 1 0
解説 :
    8 の真の約数は 4, 2, 1。その和は 7
    7 の真の約数は 1。その和は 1
    1 の真の約数は存在しないため、その和は 0

完全数・友愛数・社交数との関係

アリコット数列は、以下の3種類の特別な数と深い関わりがあります。

  • 完全数:数列の長さが1(自分自身に戻る)となる数。例:6(1 + 2 + 3 = 6)
  • 友愛数:数列の長さが2となり、互いに相手へ戻るペア。例:220 と 284(220 の約数の和は 284、284 の約数の和は 220)
  • 社交数:数列が長さ3以上のサイクルを形成する数。例:12496 → 14288 → 15472 → 14536 → 14264 → 12496

アリコット数列を求めるには、各項ごとに真の約数を計算する必要があります。ここでは、√n まで試し割りを行うことで効率よく約数を求める手法を採用します。

アルゴリズム

  1. 数を初期化します。
  2. その数のすべての真の約数を求めます。
  3. 真の約数の総和を計算します。
  4. 総和を出力し、その値を新しい数として手順1に戻ります。

C++での実装例

#include <bits/stdc++.h>
using namespace std;
int Sumfactorial(int n){
    int sum = 0;
    for (int i=1; i<=sqrt(n); i++){
        if (n%i==0){
            if (n/i == i)
                sum = sum + i;
            else{
                sum = sum + i;
                sum = sum + (n / i);
            }
        }
    }
    return sum - n;
}
void Aliquotsequence(int n){
    printf("%d ", n);
    unordered_set<int> s;
    s.insert(n);
    int next = 0;
    while (n > 0){
        n = Sumfactorial(n);
        if (s.find(n) != s.end()){
            cout << "\nRepeats with " << n;
            break;
        }
        cout << n << " ";
        s.insert(n);
    }
}
int main(){
    Aliquotsequence(45);
    return 0;
}

実行結果

45 33 15 9 4 3 1 0

このプログラムでは、unordered_set を使ってすでに出現した値を記録しています。同じ値が再び現れた場合(サイクルが検出された場合)は処理を終了するため、完全数や友愛数のように無限ループに陥る可能性のあるケースでも安全に停止できます。

  1. C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】

    この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具

  2. C++で五胞体数(ペンタトープ数)を求める方法

    五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の