I just did a quick recursive function
-module(larray).
-include_lib("eunit/include/eunit.hrl").
-export([intersection/2]).
increment_rank(Key, Dict) ->
dict:update_counter(Key, 1, Dict).
get_numbers([],[], Rank) ->
Rank;
get_numbers([], [H|Rest], Rank) ->
get_numbers([], Rest, increment_rank(H, Rank));
get_numbers([H|Rest], B, Rank) ->
get_numbers(Rest, B, increment_rank(H, Rank)).
get_numbers(A, B) ->
get_numbers(A, B, dict:new()).
intersection(ListA, ListB) ->
Numbers = get_numbers(ListA, ListB),
lists:usort([Unique || Unique <- dict:fetch_keys(Numbers), dict:fetch(Unique, Numbers) > 1]).
%% helper functions to create big lists of random integers
large_random_array(N, MaxValue) ->
large_random_array(N, MaxValue, []).
large_random_array(0, _, L) ->
L;
large_random_array(N, MaxValue, L) ->
large_random_array(N - 1, MaxValue, [random:uniform(MaxValue) | L]).
intersection_test_() ->
ListA = lists:usort(large_random_array(100000, 1000000)),
ListB = lists:usort(large_random_array(100000, 1000000)),
Result = lists:usort(sets:to_list(sets:intersection(sets:from_list(ListA), sets:from_list(ListB)))),
?_assertEqual(Result, intersection(ListA,ListB)).