Archive for July, 2010

Project Euler Problem #102!

July 15th, 2010

Problem 102 says:

Three distinct points are plotted at random on a Cartesian plane, for which -1000 ≤ x, y ≤ 1000, such that a triangle is formed.

Consider the following two triangles:

A(-340,495), B(-153,-910), C(835,-947)

X(-175,41), Y(-421,-714), Z(574,-645)

It can be verified that triangle ABC contains the origin, whereas triangle XYZ does not.

This problem can be solved in a lot of different ways depending on how one wishes to approach it. You can find the angle of each two point pair of the triangle and the origin and check to see if they add to 360 degrees which would mean the point is inside the triangle, construct a special matrix and take the determinant, etc. However I chose to use a half plane method because it was quicker to implement and didn’t take that much longer to run. Basically we take the two point pairings of the points of the triangle and check to see if the origin is on the same side for all of them. I make the assumption that because they did not mention how points on the edge of the triangle should be handled that there are no such points which allows us to skip some checking.

Solution provided in c#/mono, runs in about .01 second including reading the file.

using System;
using System.Diagnostics;
using System.Drawing;
namespace Problem102
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			PointF origin = new PointF(0f,0f);
			Stopwatch sw = new Stopwatch();
			sw.Start();

			int TrianglesWithOrigin = 0;

			string line;
			System.IO.StreamReader file = new System.IO.StreamReader("triangles.txt");
			while((line = file.ReadLine()) != null)
			{
				string[] values = line.Split(',');
				PointF p1 = new PointF(float.Parse(values[0]),float.Parse(values[1]));
				PointF p2 = new PointF(float.Parse(values[2]),float.Parse(values[3]));
				PointF p3 = new PointF(float.Parse(values[4]),float.Parse(values[5]));
				if (Inside(origin,p1,p2,p3))
					TrianglesWithOrigin += 1;
			}
			file.Close();
			sw.Stop();
			Console.WriteLine(TrianglesWithOrigin);
			Console.WriteLine(sw.Elapsed);
			Console.ReadLine();
		}
		public static float Sign (PointF p1, PointF p2, PointF p3)
		{
			return (p1.X - p3.X) * (p2.Y - p3.Y) - (p2.X - p3.X) * (p1.Y - p3.Y);
		}
		public static bool Inside (PointF pt, PointF p1, PointF p2, PointF p3)
		{
			bool b1 = Sign(pt, p1, p2) < 0.0f;
			bool b2 = Sign(pt, p2, p3) < 0.0f;
  			bool b3 = Sign(pt, p3, p1) < 0.0f;
			return ((b1 == b2) && (b2 == b3));
		}

	}
}

Tags: , ,
Posted in Project Euler | Comments (0)

Book Review: Mathematics – A Very Short Intoduction.

July 11th, 2010

(This post is the first in a new section on this site. This will probably become a regular item on the site as I read through the library of books I have laying about. As I have a lot of math related books around right now most of the book reviews will be math related at first.)

Mathematics: A Very Short Introduction is an easy to read book that attempts to explain to the reader the differences between research mathematics and the math taught in high schools. It covers subjects such as: mathematical modeling which is the creation of a mathematical system to describe a measurable phenomenon, Abstraction the application of ideas in a general manner, Proofs, Dimensions above an beyond the three we live in, Accurate Estimation plus a whole section on Questions the author (Timothy Gowers) is frequently asked. The book also touches on complex numbers, limits, and infinity making all of these ideas accessible for those that have never seen them before while not focusing on those ideas enough to bore the people already familiar with them (such as those that have taken a college calculus course). Mathematics: A Very Short Introductionuses diagrams and basic English to explain ideas and theories. There is almost no math in the book as it’s primarily about the type of work mathematicians come across in their daily jobs. This would be a good read for anybody that might be interested in going into mathematics to get a basic idea about what mathematics entails at the higher levels. The most interesting part of the book would have to be the chapter of questions the author is asked. It’s great to get the opinion from someone who has been in the field about some of the questions that appear, such as the common question of whether or not mathematicians burn out in their late twenties. With Mathematics: A Very Short Introduction costing less than $10 USD it’s a great book for anybody interested in math to pickup and read.

Tags: ,
Posted in Books | Comments (0)

Project Euler Problem #71!

July 7th, 2010

I’m just getting back into the swing of things here after a busy period between work, life and college.

Anyways, Problem #71 says:

Consider the fraction, n/d, where n and d are positive integers. If n

If we list the set of reduced proper fractions for d ≤ 8 in ascending order of size, we get:

1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8

It can be seen that 2/5 is the fraction immediately to the left of 3/7.

By listing the set of reduced proper fractions for d ≤ 1,000,000 in ascending order of size, find the numerator of the fraction immediately to the left of 3/7.

So the trick here is to just look at the denominators. We know the number we are trying to get close to is 3/7 so we make the numerator ((3/7)*denominator) which will most likely be a float, we then take the floor of that value which gives us the closest integer and use that value as the numerator. We then check the numerator and denominator against each other to make sure the GCD is 1. We can then check to see if this new fraction is closer to (3/7) or further away than the last value we checked keeping the closer of the two.

Solution runs in around 2 seconds. Written in c#/mono.

using System;
using System.Collections;
using System.Diagnostics;

namespace Problem71
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			Fraction Standard = new Fraction(3,7);
			Fraction Closest = new Fraction(0,1);
			Stopwatch sw = new Stopwatch();
			sw.Start();

			for (int d = 1; d<=1000000;d++)
			{
				int n = (int)Math.Floor(((double)3/(double)7)*d);
					if (GCD(d,n) == 1)
					{
						Fraction f = new Fraction(n,d);
						if (f.Value < Standard.Value)
						{
							if (f.Value > Closest.Value)
							{
								Closest = f;
							}
						}

					}

			}
			sw.Stop();
			Console.Write(Closest.Numerator.ToString() + "/" +
                             Closest.Denominator.ToString()+System.Environment.NewLine);
			Console.WriteLine(sw.Elapsed);
			Console.ReadLine();
		}
		public static int GCD (int a, int b)
		{
			if (b == 0)
				return a;
			else
				return GCD(b,(a%b));
		}
	}
	class Fraction
	{
		public Fraction (int n, int d)
		{
			_numerator = n;
			_denominator = d;
		}
		private int _numerator;
		private int _denominator;
		public int Numerator
		{
			get{return _numerator;}
			set{_numerator = value;}
		}
		public int Denominator
		{
			get{return _denominator;}
			set{_denominator = value;}
		}
		public decimal Value
		{
			get{return (((decimal)_numerator)/((decimal)_denominator));}
		}
	}
}

Tags:
Posted in Project Euler | Comments (0)

This blog collects statistical data with Statpress SEOlution in the reVierphone Edition! Give it a try.