WITH RECURSIVE t(a, b) AS ( VALUES (38, 12) UNION ALL SELECT least(a, b), abs(a - b) FROM t WHERE abs(a - b) > 0 ) SELECT a AS gcd FROM t WHERE a = b; * This source code was highlighted with Source Code Highlighter .
WITH RECURSIVE t(a, b) AS ( VALUES (38, 12) UNION ALL SELECT least(a, b), abs(a - b) FROM t WHERE abs(a - b) > 0 ) SELECT a AS gcd FROM t WHERE a = b; * This source code was highlighted with Source Code Highlighter .
WITH RECURSIVE t(a, b) AS ( VALUES (38, 12) UNION ALL SELECT least(a, b), abs(a - b) FROM t WHERE abs(a - b) > 0 ) SELECT a AS gcd FROM t WHERE a = b; * This source code was highlighted with Source Code Highlighter .
WITH RECURSIVE t(a, b) AS ( VALUES (38, 12) UNION ALL SELECT least(a, b), abs(a - b) FROM t WHERE abs(a - b) > 0 ) SELECT a AS gcd FROM t WHERE a = b; * This source code was highlighted with Source Code Highlighter .
WITH RECURSIVE t(a, b) AS ( VALUES (38, 12) UNION ALL SELECT least(a, b), abs(a - b) FROM t WHERE abs(a - b) > 0 ) SELECT a AS gcd FROM t WHERE a = b; * This source code was highlighted with Source Code Highlighter .
WITH RECURSIVE t(a, b) AS ( VALUES (38, 12) UNION ALL SELECT least(a, b), abs(a - b) FROM t WHERE abs(a - b) > 0 ) SELECT a AS gcd FROM t WHERE a = b; * This source code was highlighted with Source Code Highlighter .
WITH RECURSIVE t(a, b) AS ( VALUES (38, 12) UNION ALL SELECT least(a, b), abs(a - b) FROM t WHERE abs(a - b) > 0 ) SELECT a AS gcd FROM t WHERE a = b; * This source code was highlighted with Source Code Highlighter .
WITH RECURSIVE t(a, b) AS ( VALUES (38, 12) UNION ALL SELECT least(a, b), abs(a - b) FROM t WHERE abs(a - b) > 0 ) SELECT a AS gcd FROM t WHERE a = b; * This source code was highlighted with Source Code Highlighter .
WITH RECURSIVE t(a, b) AS ( VALUES (38, 12) UNION ALL SELECT least(a, b), abs(a - b) FROM t WHERE abs(a - b) > 0 ) SELECT a AS gcd FROM t WHERE a = b; * This source code was highlighted with Source Code Highlighter .
WITH RECURSIVE t(a, b) AS ( VALUES (38, 12) UNION ALL SELECT least(a, b), abs(a - b) FROM t WHERE abs(a - b) > 0 ) SELECT a AS gcd FROM t WHERE a = b; * This source code was highlighted with Source Code Highlighter .
しかし、大学で正直に5年間座っていた私の熱心な性質は、意見の相違を望みました。 これから、実際、私の研究が始まりました。
まず第一に、非常に簡単なオプション:
*このソースコードは、 ソースコードハイライターで強調表示されました。
- 再帰 t(a、b) AS (
- 値 ( 38、12 )
- UNION ALL
- SELECT b、mod(a、b) FROM t
- WHERE b> 0
- )
- SELECT a AS gcd FROM t WHERE b = 0;
多くの人がこの実装で有名なユークリッドアルゴリズムを認識すると確信しています。 この特定の例では、2であるGCD(38、12)を見つけます。
この奇跡の将来の使用を促進し促進するために、関数を書くことが決定されました。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- 関数の作成 または置換 gcd(bigint、bigint)は、bigint ASを返します
- $$
- 再帰 t(a、b) AS (
- 値 (abs($ 1):: bigint、abs($ 2):: bigint)
- UNION ALL
- SELECT b、mod(a、b) FROM t
- WHERE b> 0
- )
- SELECT a AS gcd FROM t WHERE b = 0;
- $$
- 不変
- 厳密
- LANGUAGE SQL ;
いくつかの改善に注意してください:
- 型bigintの関数は機能し、int8です。
- 入力パラメータは、避けるために直ちにモジュロになります。
- この関数はIMMUTABLEとしてマークされています。これにより、オプティマイザーの操作が楽になります。これは、同じ入力データに対して同じ結果が返されることを意味するためです。
- 関数はSTRICTとしてマークされます。つまり、少なくとも1つの引数がNULLの場合、結果はNULLになります。
これらすべての結果として、 wiki.postgresql.orgで私の作品を不滅にするのに十分でした 。
このオプスが理解されている場合、 NOC (最小一般倍数)の計算方法に関する続きがあります。