Home
Blog
Products
Profile
Study
Collatz
© 2024 Oizumi Yuta

カーブドッチヴィネスパ、タイヤ交換

2024-12-01

今日はタイヤ交換のため妻が子どもを連れて実家に帰ったので、一人でカーブドッチヴィネスパに行ってきた。最高だった。

温泉につかった後のぶどうジュース赤も最高だった。見た目が赤ワインと見分けがつかないので念のためノンアルコールかどうか確認した。

ぶどうジュース赤を飲みながら解析的整数論を読んだがさっぱりわからないのでコラッツ予想について考えた。こちらもさっぱりわからず考えたらうとうとしてきた。

12:00 ごろヴィネスパを出て家に帰り、タイヤ交換に向かった。タイヤ交換は セルフ 116 西川 SS / 宮島石油販売(株) でしてもらった。最後、ナットがすべてしっかり締まっているか目の前で確認してくれた。昨年は事故が多発してちゃんと締まっているか気になっていたので大変ありがたい。

来年もまたタイヤ交換をしなければならないのでメモしておく。

1.https://gogo.gs/search/ で「新潟県」、「西蒲区」を選択。
2.「セルフ 116 西川 SS / 宮島石油販売(株)」を押下。
3.https://gogo.gs/shop/1501000026#shop-detail-info の「ネット予約はこちら」を押下。

タイヤ交換を終え家に帰り子どもと遊び、夕ご飯を食べ、またコラッツ予想について考えている。

コラッツ数列表をようやく API 化した:

https://oizumi-yuta.com/collatz/sequence

Next.js により SSR を行っている:

import styles from './sequence.module.css';

type Sequences = Record<string, string>; // `sequences` の型を定義 (キー: string, 値: string)

const CollatzSequences = async (): Promise<JSX.Element> => {
  const res = await fetch(`${process.env.BACKEND_URL}/collatz/sequences`, {
    cache: 'no-store',
  });

  // レスポンスの型を推論可能にする
  const resJson: { data: Sequences } = await res.json();

  // コラッツ数列からなる配列
  const sequences = resJson.data;

  return (
    <div className={styles.main}>
      <div className={styles.card}>
        <table className={styles.table}>
          <thead>
            <tr>
              <th className={styles.th}>初期値</th>
              <th className={styles.th}>数列</th>
            </tr>
          </thead>
          <tbody>
            {Object.entries(sequences).map(([key, value]) => (
              <tr key={key}>
                <td className={styles.td}>{key}</td>
                <td className={styles.td}>{value || 'なし'}</td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </div>
  );
};

export default CollatzSequences;

バックエンドはコラッツ数列を計算して返す:

/**
 * コラッツ数列を計算する
 */
export const getCollatzSequence = (n) => {
  const sequence = [];
  while (n !== 1 && !isNaN(n)) {
    if (n % 2 === 0) {
      n = n / 2;
      if (n % 2 !== 0) {
        sequence.push(n);
      }
    } else {
      n = 3 * n + 1;
    }
  }

  return sequence.join(', ');
};

/**
 * 各コラッツ数列のオブジェクトを返す
 */
export const getCollatzSequences = () => {
  const sequences = {};

  for (let n = 1; n < 100; n++) {
    if (n % 2 === 0) {
      continue;
    }

    if (n === 1) {
      sequences[n] = n;
      continue;
    }

    const sequence = getCollatzSequence(n);
    sequences[n] = sequence;
  }

  return sequences;
};