1824年にノルウェーの数学者ニールス・アーベルは、自費でわずか6頁の五次の一般方程式の解法に関する研究を著した。これはある置換の集合の可換性が重要なることを明らかにするものであった。こんにち可換群にアーベルの名を関するのはこの発見に依拠するのである。エヴァリスト・ガロワも同じ問題に取り組み、1831年に初めて「形式群」(groupe formel) の語を用いた。この論文は後にジョゼフ・リウヴィルによって出版されている。19世紀後半、有限群の研究が本質的に表れて初めてガロワ理論が構築されていくことになる。形式群の概念の形成には多くの年月が必要とされたにもかかわらず、クロネッカーはその公理化における一人の役者である。1870年にはこんにち用いられるのと同値な有限アーベル群の定義が与えられている。一般の定義はハインリッヒ・ヴェーバーによる。1853年にレオポルト・クロネッカーは有理数体の有限拡大で可換なガロワ群を持つものは円分拡大の部分体であることを述べた。こんにちクロネッカー–ヴェーバーの定理と呼ばれるこの定理の、クロネッカーによる証明は誤っており、リヒャルト・デデキント、ハインリッヒ・ヴェーバーを経て最終的にダフィット・ヒルベルトが厳密な証明を与えた。この流れにおいてクロネッカーは、1870年の論文において（こんにちではクロネッカーの名を関する）有限アーベル群の構造定理を証明した一人に数えられる。
数学の殊に代数学において有限アーベル群（ゆうげんアーベルぐん、英: finite abelian group）は、可換かつ有限なる群を言う。ゆえにこれは有限型のアーベル群の特別の場合である。にも拘らず、有限アーベル群の概念には独自の長い歴史と特有の様々な応用（合同算術のような純粋数学的なものも、誤り訂正符号のような工学的なものも含めて）を有する。クロネッカーの定理は有限アーベル群の構造を陽に記述する。すなわち、有限アーベル群は巡回群の直積である。群の圏において、有限アーベル群の全体は自己双対部分圏を成す。
2018年3月改正より平日朝に大牟田駅→博多駅間の上り1本のみ運行され土・休日は運行しない。号数表記は無く単に「有明」と記載される。定期運行を行っているJR特急列車の運行本数としては最少である。現在のように通勤ライナー的な性格を持った列車となったのは2011年3月12日のダイヤ改正からだが、当時は長洲駅発着が下り3本・上り2本熊本駅発着が1往復設定されていた。熊本駅発着の1往復は九州新幹線の部分開業以前に運行されていた夜行列車（急行「かいもん」→特急「ドリームつばめ」）の系譜を受け継いだ列車であり、九州新幹線の全線開業で並行在来線特急列車の殆どは新幹線に移行したがこの1往復のみ下りが博多駅0時台発、上りが熊本駅4時台発で発車時刻が新幹線の営業時間（6時-24時）外であることから熊本発着のまま存続した。熊本発着列車は2014年3月15日のダイヤ改正で廃止され、残った5本も2018年3月17日のダイヤ改正で上り1本を除き廃止され、大牟田以北のみの運行となった。九州新幹線全線開業以前は博多-熊本間を「リレーつばめ」と合わせて1時間あたり3本の割合で運行しており、大半の列車が豊肥本線に乗り入れていた（当初は水前寺駅発着だったが、2006年3月18日改正以降は大半の列車が光の森駅発着となった）。また1時間に1本は小倉駅発着で運転を行い、「ソニック」と合わせ小倉-博多間でも1時間あたり3本の特急運行を確保していた。九州新幹線全線開業時に博多駅-荒尾駅間には既存快速の延長運転および普通列車の格上げで快速を増発。大牟田駅-熊本駅・八代駅間に「くまもとライナー」を、豊肥線内に「豊肥ライナー」を新設して実質的な代替措置としていたが「豊肥ライナー」は2013年3月16日改正、「くまもとライナー」は2015年3月14日改正でそれぞれ各駅停車に格下げされる形で運行を終了。小倉-博多間については「きらめき」として存置され、九州新幹線開業前の運行頻度を確保していたが、2018年3月17日改正で「きらめき」の日中運行は殆ど廃止された。
C言語での実装例。RFC 1952 (gzip) や RFC 2083 (PNG) の末尾にも実装例が載っている。zlib などにも含まれている。uint32_t crc_table[256];void make_crc_table(void) {    for (uint32_t i = 0; i < 256; i++) {        uint32_t c = i;        for (int j = 0; j < 8; j++) {            c = (c & 1) ? (0xEDB88320 ^ (c >> 1)) : (c >> 1);        }        crc_table[i] = c;    }}uint32_t crc32(uint8_t *buf, size_t len) {    uint32_t c = 0xFFFFFFFF;    for (size_t i = 0; i < len; i++) {        c = crc_table[(c ^ buf[i]) & 0xFF] ^ (c >> 8);    }    return c ^ 0xFFFFFFFF;}int main(void){    make_crc_table();    uint32_t crc = crc32();        return 0;}生成多項式を反転させない場合の実装例。uint32_t crc_table[256];/* 事前にこの関数を実行しておくこと */void make_crc_table(void){    for(uint32_t i=0; i<256; i++){        uint32_t c = i << 24;        for( int j=0; j<8; j++){            c = ( c << 1) ^ ( ( c & 0x80000000) ? 0x04C11DB7 : 0);        }        crc_table[i] = c;    }}uint32_t crc32(uint8_t *buf, int len){    uint32_t c = 0xffffffff;    for (int i = 0; i < len; i++)    {        c = (c << 8) ^ crc_table[((c >> 24) ^ buf[i]) & 0xff];    }    return c;}