Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

--	$NetBSD: happy.lua,v 1.1 2017/04/15 04:27:30 kamil Exp $
--
-- Copyright (c) 2015 The NetBSD Foundation, Inc.
-- All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions
-- are met:
-- 1. Redistributions of source code must retain the above copyright
--    notice, this list of conditions and the following disclaimer.
-- 2. Redistributions in binary form must reproduce the above copyright
--    notice, this list of conditions and the following disclaimer in the
--    documentation and/or other materials provided with the distribution.
--
-- THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
--
-- Commentary:
-- A happy number is a number defined by the following process: Starting with
-- any positive integer, replace the number by the sum of the squares of its
-- digits, and repeat the process until the number equals 1 (where it will
-- stay), or it loops endlessly in a cycle which does not include 1. Those
-- numbers for which this process ends in 1 are happy numbers, while those that
-- do not end in 1 are unhappy numbers (or sad numbers).
--
-- For more information on happy numbers, and the algorithms, see
--      http://en.wikipedia.org/wiki/Happy_number
--
-- The happy number generator is here only to have something that the user
-- can read from our device.  Any other arbitrary data generator could
-- have been used.  The algorithm is not critical to the implementation
-- of the module.

local HAPPY_NUMBER = 1

-- If n is not happy then its sequence ends in the cycle:
-- 4, 16, 37, 58, 89, 145, 42, 20, 4, ...
local SAD_NUMBER = 4

-- This following algorithm is designed for numbers of the integer type.
-- Integer numbers are used by default in the NetBSD kernel, as there would be
-- need for additional overhead in context-switch with support for floats.

function dsum(n)
	local sum = 0
	while n > 0 do
		local x = n % 10
		sum = sum + (x * x)
		n = n / 10
	end
	return sum
end

function is_happy(n)
	while true do
		local total = dsum(n)

		if total == HAPPY_NUMBER then
			return 1
		end
		if total == SAD_NUMBER then
			return 0
		end

		n = total
	end
end